Что нового

[Элементы GUI] Как сделать красивый интерфейс?

Mr. Anderson

Новичок
Сообщения
122
Репутация
4
Сабж, например
mac-beautiful-2.jpg

или
1225472015_pic_id64657.jpeg
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,320
Mr. Anderson
Посмотрите, как Yashied красиво сделал Калькулятор с поддержкой скинов.
Или вот Вам простой пример:
Код:
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>

$j = Random(0, 9, 1)
Dim $aPic[10] = [@ScriptDir & '\1.jpg', @ScriptDir & '\2.jpg', _
		@ScriptDir & '\3.jpg', @ScriptDir & '\4.jpg', @ScriptDir & '\5.jpg', _
		@ScriptDir & '\6.jpg', @ScriptDir & '\7.jpg', @ScriptDir & '\8.jpg', _
		@ScriptDir & '\9.jpg', @ScriptDir & '\0.jpg']

$hGui = GUICreate('', 150, 100, -1, -1, $WS_POPUP)
GUISetBkColor(0x000000)
_GuiRoundCorners($hGui, 0, 0, 20, 20)
GUIRegisterMsg($WM_NCHITTEST, 'WM_NCHITTEST')

$Pic = GUICtrlCreatePic($aPic[$j], 40, 29, 24, 28)
GUICtrlSetCursor(-1, 0)
$LabelExit = GUICtrlCreateLabel('X', 134, 3, 16, 16)
GUICtrlSetState(-1, $GUI_FOCUS)
GUICtrlSetColor(-1, 0xFFFFFF)
GUICtrlSetBkColor(-1, 0x000000)
GUICtrlSetBkColor(-1, $GUI_BKCOLOR_TRANSPARENT)
GUICtrlSetCursor(-1, 0)
$ButtonUP = GUICtrlCreateButton('с', 94, 20, 22, 22, -1, $WS_EX_STATICEDGE)
$ButtonDown = GUICtrlCreateButton('т', 94, 45, 22, 22, -1, $WS_EX_STATICEDGE)
$ButtonGo = GUICtrlCreateButton('ф', 40, 65, 24, 24, -1, $WS_EX_STATICEDGE)

For $i = $ButtonUP To $ButtonGo
	GUICtrlSetCursor($i, 0)
	GUICtrlSetFont($i, 11, 600, 0, 'Wingdings')
	GUICtrlSetColor($i, 0xFFFFFF)
	GUICtrlSetBkColor($i, 0x000000)
Next
DllCall('User32.dll', 'long', 'AnimateWindow', 'hwnd', $hGui, 'long', 800, 'long', 0x10)
GUISetState()

While 1
	$nMsg = GUIGetMsg()
	Switch $nMsg
		Case $GUI_EVENT_CLOSE, $LabelExit
			DllCall('User32.dll', 'long', 'AnimateWindow', 'hwnd', $hGui, 'long', 800, 'long', 0x10 + 0x10000)
			Exit
		Case $ButtonUP
			_ButtonState(0)
			$j += 1
			If $j = 10 Then
				$j = 0
			EndIf
			GUICtrlSetImage($Pic, $aPic[$j])
			_ButtonState(1)
		Case $ButtonDown
			_ButtonState(0)
			$j -= 1
			If $j = -1 Then
				$j = 9
			EndIf
			GUICtrlSetImage($Pic, $aPic[$j])
			_ButtonState(1)
		Case $ButtonGo
			_ButtonState(0)
			For $i = 0 To 9
				GUICtrlSetImage($Pic, $aPic[$i])
				Sleep(300)
			Next
			$j = 9
			_ButtonState(1)
		Case $Pic
			MsgBox(64, 'Test', 'Картинка работает как кнопка.')
	EndSwitch
WEnd

Func _ButtonState($n)
	Local $iState
	If $n Then
		$iState = $GUI_ENABLE
	Else
		$iState = $GUI_DISABLE
	EndIf
	For $i = $Pic To $ButtonGo
		GUICtrlSetState($i, $iState)
	Next
EndFunc   ;==>_ButtonState

Func _GuiRoundCorners($h_win, $i_x1, $i_y1, $i_x3, $i_y3)
	Dim $pos, $ret, $ret2
	$pos = WinGetPos($h_win)
	$ret = DllCall("gdi32.dll", "long", "CreateRoundRectRgn", "long", $i_x1, "long", $i_y1, "long", $pos[2], "long", $pos[3], "long", $i_x3, "long", $i_y3)
	If $ret[0] Then
		$ret2 = DllCall("user32.dll", "long", "SetWindowRgn", "hwnd", $h_win, "long", $ret[0], "int", 1)
		If $ret2[0] Then
			Return 1
		Else
			Return 0
		EndIf
	Else
		Return 0
	EndIf
EndFunc   ;==>_GuiRoundCorners

Func WM_NCHITTEST($hWnd, $msg, $wParam, $lParam)
	Local $iProc = DllCall('user32.dll', 'int', 'DefWindowProc', 'hwnd', $hWnd, 'int', _
			$msg, 'wparam', $wParam, 'lparam', $lParam)
	If $iProc[0] = $HTCLIENT Then Return $HTCAPTION
	Return $GUI_RUNDEFMSG
EndFunc   ;==>WM_NCHITTEST
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,716
Проблема в том, что при использовании скинов практически всегда приходиться программировать свои элементы GUI, т.е. писать собственные обработчики для них. А это очень хлопотно. Самое простое - кнопка (см. тот самый калькулятор).
 

aleratorio

Осваивающий
Сообщения
85
Репутация
42
madmasles сказал(а):
Или вот Вам простой пример: ........

Здорово! А как сделать так, что бы окно не разворачивалось из центра, а появлялось, постепенно уменьшая прозрачность?

Написал вот скрипт:
Код:
#NoTrayIcon
#include <GUIConstants.au3>
#include <WindowsConstants.au3>

Opt("GUIOnEventMode", 1)

$gui = GUICreate("About GUI", 400, 100, -1, -1, $WS_POPUP + $WS_SYSMENU + $WS_MINIMIZEBOX, $WS_EX_LAYERED)
GUISetOnEvent($GUI_EVENT_CLOSE, "Close")

$close = GUICtrlCreateLabel("", 380, 0, 20, 20)
GUICtrlSetOnEvent($close, "Close")
GUICtrlSetTip($close, "Close")

$pic = GUICtrlCreatePic('logo.bmp', 0, 0, 400, 100)
GUICtrlSetOnEvent($pic, "_Drag")

$text = GUICtrlCreateLabel("Text", 152, 25, 300, 67)
GUICtrlSetFont($text, 20, -1, -1, 'Arial Black', 5)
GUICtrlSetBkColor ($text, 0x7f7f7f)
;~ DllCall('User32.dll', 'long', 'AnimateWindow', 'hwnd', $gui, 'long', 800, 'long', 0x10)
GUISetState(@SW_SHOW)

While 1
	Sleep(1000)
WEnd

Func Close()
	GUISetState(@SW_HIDE)
	Exit
EndFunc

Func _Drag()
	DllCall("user32.dll", "int", "ReleaseCapture")
	DllCall("user32.dll", "int", "SendMessage", "hWnd", $gui, "int", 0xA1, "int", 2, "int", 0)
EndFunc

если использовать DllCall('User32.dll', 'long', 'AnimateWindow', 'hwnd', $gui, 'long', 800, 'long', 0x10), как то не очень красиво получается.

Хотелось бы добавить к нему что то типа:
Код:
For $i = 100 To 0 Step -10
     SetTransparency($i) ;Задает прозрачность в процентах
Next


В архиве файл logo.bmp
 
Автор
M

Mr. Anderson

Новичок
Сообщения
122
Репутация
4
Извините за... ламерство. Но все же как создаются такие красивые интерфейсы? Картинку на фон и всё? А элементы?
 

Viktor217

Осваивающий
Сообщения
233
Репутация
31
Мои предположения, идут отдельные картинки, фон кнопки и прочее...
Рисуется фон, дальше картинки, потом определёнными функциями назначается действие на определённое событие...
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,320
Mr. Anderson
Вот очень, на мой взгляд, симпатичный пример от Yashied`a.
 
Верх