Что нового

Создание своих элементов управления (кнопка)

musicstashall

Знающий
Сообщения
322
Репутация
7
Хочу создать свою кнопку а-ля виндовую, набросал графику, всё прекрасно.
1. Не знаю как присвоить (создать) созданной кнопке идентификатор.
2. Как использовать GUICtrlOnHover.au3 и передавать элементу параметры графики при наведении курсора?

Код:
#Include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WinAPI.au3>
#include <GDIPlus.au3>
#include <WinAPIGdi.au3>
#include "GUICtrlOnHover.au3"
#include <GUIConstants.au3>

Global $iColorAero = '0x' & StringReplace(Hex(_WinAPI_DwmGetColorizationColor()), '00000000', '')
Global $ColorFont = _WinAPI_GetSysColor($COLOR_WINDOW)

Global $gui, $x, $y, $w, $h, $Color1, $Color2


$gui0 = GUICreate("", 200, 150, 300, 300)
$lab2 = GUICtrlCreateLabel('Текущий цвет Аэро', 23, 80, 70, 30, $SS_CENTER)

GUISetBkColor($ColorFont, $gui0)
GUISetState()
ButtomActive($gui0, 21, 4)

While 1
	If WinExists($gui0) Then
		If $iColorAero <> '0x' & StringReplace(Hex(_WinAPI_DwmGetColorizationColor()), '00000000', '') Then
		    ConsoleWrite("Изменился цвет аэро" & @CR)
		    $iColorAero = '0x' & StringReplace(Hex(_WinAPI_DwmGetColorizationColor()), '00000000', '')
		    ButtomActive($gui0, 21, 4)
	    EndIf
	Else
		ExitLoop
	EndIf

	Sleep(10)
WEnd


Func ButtomActive($gui, $x, $y)
	$lab1 = GUICtrlCreateLabel('', $x, $y, 72, 72) ;здесь нужно создать идентификатор, в данном случае служит стандартный контрол Label
	_GUICtrl_OnHoverRegister(-1, "_Hover_Event", "_Primary_Event", $gui, $x, $y)

	Graphic($gui, $x + 8, $y + 8, 56, 56, 0xFF879289, 0xFF879289); второй слой графики кнопки
	Graphic($gui, $y + 9, $y + 9, 54, 54, 0xFFFFFFFF, 0xFFFFFFFF); третий слой графики
	Graphic($gui, $y + 10, $y + 10, 52, 52, 0xFFFFFFFF, $iColorAero) ;четвертый слой
EndFunc

Func _Hover_Event($iCtrlID) ;сюда нужно передать значения переменных $gui, $x, $y
	Graphic($gui, $x, $y, 72, 72, 0xFFE5F3FF, 0xFFE5F3FF); первый слой графики кнопки, при наведении курсора, появляется в левом верхнем углу экрана, т.к не заданы координаты, и гаснет, т.к создается вне окна
EndFunc

Func _Primary_Event($iCtrlID, $iParam)

EndFunc

Func Graphic($gui, $x, $y, $w, $h, $Color1, $Color2) ; шаблон кисти для рисования квадратиков
	Local $hGraphic, $hBrush, $tRECTF, $fAngle
	_GDIPlus_Startup()
	$hGraphic = _GDIPlus_GraphicsCreateFromHWND($GUI)
	$fAngle = 45
	$tRECTF = _GDIPlus_RectFCreate($x, $y, $w, $h)
	$hBrush = _GDIPlus_LineBrushCreateFromRectWithAngle($tRECTF, $Color1, $Color2, $fAngle, False)
	_GDIPlus_LineBrushSetSigmaBlend($hBrush, 1)
	_GDIPlus_GraphicsFillRect($hGraphic, $x, $y, $w, $h, $hBrush)
	_GDIPlus_BrushDispose($hBrush)
EndFunc
 

Вложения

  • GUICtrlOnHover.au3
    24.4 КБ · Просмотры: 3

ra4o

AutoIT Гуру
Сообщения
1,165
Репутация
246
Так Ваш "$lab1" и будет идентификатором кнопки:
Код:
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WinAPI.au3>
#include <GDIPlus.au3>
#include <WinAPIGdi.au3>
#include "GUICtrlOnHover.au3"
#include <GUIConstants.au3>

Global $iColorAero = '0x' & StringReplace(Hex(_WinAPI_DwmGetColorizationColor()), '00000000', '')
Global $ColorFont = _WinAPI_GetSysColor($COLOR_WINDOW)

Global $gui, $x, $y, $w, $h, $Color1, $Color2, $lab1


$gui0 = GUICreate("", 200, 150, 300, 300)
$lab2 = GUICtrlCreateLabel('Текущий цвет Аэро', 23, 80, 70, 30, $SS_CENTER)

GUISetBkColor($ColorFont, $gui0)
GUISetState()
ButtomActive($gui0, 21, 4)

While 1
	$msg1 = GUIGetMsg()
	If WinExists($gui0) Then
		If $iColorAero <> '0x' & StringReplace(Hex(_WinAPI_DwmGetColorizationColor()), '00000000', '') Then
			ConsoleWrite("Изменился цвет аэро" & @CR)
			$iColorAero = '0x' & StringReplace(Hex(_WinAPI_DwmGetColorizationColor()), '00000000', '')
			ButtomActive($gui0, 21, 4)
		EndIf
	Else
		ExitLoop
	EndIf
	Select
		Case $msg1 = $GUI_EVENT_CLOSE ;при закрытии окна-выход
			Exit
		Case $msg1 = $lab1
			MsgBox(0, '', 'Нажата красивая кнопочка !')
	EndSelect
	Sleep(10)
WEnd


Func ButtomActive($gui, $x, $y)
	$lab1 = GUICtrlCreateLabel('', $x, $y, 72, 72) ;здесь нужно создать идентификатор, в данном случае служит стандартный контрол Label
	_GUICtrl_OnHoverRegister(-1, "_Hover_Event", "_Primary_Event", $gui, $x, $y)

	Graphic($gui, $y + 25, $y + 8, 56, 56, 0xFF879289, 0xFF879289); второй слой графики кнопки
	Graphic($gui, $y + 26, $y + 9, 54, 54, 0xFFFFFFFF, 0xFFFFFFFF); третий слой графики
	Graphic($gui, $y + 27, $y + 10, 52, 52, 0xFFFFFFFF, $iColorAero) ;четвертый слой
EndFunc   ;==>ButtomActive

Func _Hover_Event($iCtrlID) ;сюда нужно передать значения переменных $gui, $x, $y
	Graphic($gui, $x, $y, 72, 72, 0xFFE5F3FF, 0xFFE5F3FF); первый слой графики кнопки, при наведении курсора, появляется в левом верхнем углу экрана, т.к не заданы координаты, и гаснет, т.к создается вне окна
EndFunc   ;==>_Hover_Event

Func _Primary_Event($iCtrlID, $iParam)

EndFunc   ;==>_Primary_Event

Func Graphic($gui, $x, $y, $w, $h, $Color1, $Color2)
	Local $hGraphic, $hBrush, $tRECTF, $fAngle
	_GDIPlus_Startup()
	$hGraphic = _GDIPlus_GraphicsCreateFromHWND($gui)
	$fAngle = 45
	$tRECTF = _GDIPlus_RectFCreate($x, $y, $w, $h)
	$hBrush = _GDIPlus_LineBrushCreateFromRectWithAngle($tRECTF, $Color1, $Color2, $fAngle, False)
	_GDIPlus_LineBrushSetSigmaBlend($hBrush, 1)
	_GDIPlus_GraphicsFillRect($hGraphic, $x, $y, $w, $h, $hBrush)
	_GDIPlus_BrushDispose($hBrush)
EndFunc   ;==>Graphic
 
Автор
M

musicstashall

Знающий
Сообщения
322
Репутация
7
Мне нужно сделать шаблон. Впрочем я это осуществил, записывая хендл либа в массив с указанной ячейкой:
Код:
ButtomActive(1, $gui0, 21, 4)
Func ButtomActive($i, $gui, $x, $y)
	Local $iLab = GUICtrlCreateLabel('', $x, $y, 72, 72)
	_GUICtrl_OnHoverRegister(-1, "_Hover_Event", "_Primary_Event", $gui, $x, $y)
	_ArrayInsert($lArray, $i, $iLab)
	_GDIPlus_Startup()
	Graphic($gui, $x + 8, $y + 8, 56, 56, 0xFF879289, 0xFF879289)
	Graphic($gui, $x + 9, $y + 9, 54, 54, 0xFFFFFFFF, 0xFFFFFFFF)
	Graphic($gui, $x + 10, $y + 10, 52, 52, 0xFFFFFFFF, $iColorAero)
EndFunc


Передо мной сейчас задача, как передавать переменные графики (координаты и хендл окна) в событие курсора...



Добавлено:
Сообщение автоматически объединено:

Сделал так:
Код:
ButtomActive(1, $gui0, 21, 4)
ButtomActive(2, $gui0, 93, 4)
Func ButtomActive($i, $gui, $x, $y)
	$pArray[$i][0] = $gui
	$pArray[$i][1] = $x
	$pArray[$i][2] = $y
	Local $iLab = GUICtrlCreateLabel('', $x, $y, 72, 72)
	_ArrayInsert($lArray, $i, $iLab)
	_GUICtrl_OnHoverRegister($lArray[$i], "_Hover_Event", "_Primary_Event", $i)
	_GDIPlus_Startup()
	Graphic($gui, $x + 8, $y + 8, 56, 56, 0xFF879289, 0xFF879289)
	Graphic($gui, $x + 9, $y + 9, 54, 54, 0xFFFFFFFF, 0xFFFFFFFF)
	Graphic($gui, $x + 10, $y + 10, 52, 52, 0xFFFFFFFF, $iColorAero)
EndFunc

Func _Hover_Event($iCtrlID, $i)
	Graphic($pArray[$i][0], $pArray[$i][1], $pArray[$i][2], 72, 72, 0xFFE5F3FF, 0xFFE5F3FF)
EndFunc

Func _Primary_Event($iCtrlID, $iParam)
	
EndFunc

Func Graphic($gui, $x, $y, $w, $h, $Color1, $Colo2)
	Local $hGraphic, $hBrush, $tRECTF, $fAngle
	Sleep(50)
	$hGraphic = _GDIPlus_GraphicsCreateFromHWND($GUI)
	$fAngle = 45
	$tRECTF = _GDIPlus_RectFCreate($x, $y, $w, $h)
	$hBrush = _GDIPlus_LineBrushCreateFromRectWithAngle($tRECTF, $Color1, $Colo2, $fAngle, False)
	_GDIPlus_LineBrushSetSigmaBlend($hBrush, 1)
	_GDIPlus_GraphicsFillRect($hGraphic, $x, $y, $w, $h, $hBrush)
	_GDIPlus_BrushDispose($hBrush)
EndFunc


Квадрат первого слоя первой кнопки теперь на месте появляется, но уже не первым слоем, а самым верхним, перекрывая все предыдущие слои, а квадрат второй кнопки почему-то совсем не появляется......
 
Автор
M

musicstashall

Знающий
Сообщения
322
Репутация
7
Готовый вариант:
Код:
;ButtonsWin.au3

#Include-once
#include <GDIPlus.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <GUICtrlOnHover.au3>
#include <Array.au3>
Global $iColorAero = '0x' & StringReplace(Hex(_WinAPI_DwmGetColorizationColor()), '00000000', '')
Global $ColorFont = _WinAPI_GetSysColor($COLOR_WINDOW)
Global $ColorFontAlpha = '0xFF' & StringReplace(Hex($ColorFont), '00', '')

Local $GUI0, $hGraphics, $hBrush0, $hBrush1, $hBrush2, $hBrush3, $hBrush4, $tRectF
Local $lParam[100][10]

Func ButtomActive($i, $hWnd, $x, $y)
	GUIRegisterMsg($WM_PAINT, 'WM_PAINT')
	$lParam[$i][9] = GUICtrlCreateLabel('', $x + 10, $y + 10, 52, 52)
	_GUICtrl_OnHoverRegister(-1, "_Hover_Event", "_Primary_Event")
    _GDIPlus_Startup()
    $hGraphics = _GDIPlus_GraphicsCreateFromHWND($hWnd)
    $hBrush0 = _GDIPlus_BrushCreateSolid($ColorFontAlpha)
    $hBrush1 = _GDIPlus_BrushCreateSolid(0xFFE5F3FF)
    $hBrush2 = _GDIPlus_BrushCreateSolid(0xFF879289)
    $hBrush3 = _GDIPlus_BrushCreateSolid(0xFFFFFFFF)
    $tRectF = _GDIPlus_RectFCreate($x + 10, $y + 10, 52, 52)
    $hBrush4 = _GDIPlus_LineBrushCreateFromRectWithAngle($tRectF, 0xFFFFFFFF, $iColorAero, 45)
    $lParam[$i][0] = $hWnd
    $lParam[$i][1] = $hGraphics
    $lParam[$i][2] = $x
    $lParam[$i][3] = $y
    $lParam[$i][4] = $hBrush0
    $lParam[$i][5] = $hBrush1
    $lParam[$i][6] = $hBrush2
    $lParam[$i][7] = $hBrush3
    $lParam[$i][8] = $hBrush4
    Graphic($hGraphics, $x, $y, $hBrush0, $hBrush1, $hBrush2, $hBrush3, $hBrush4)
EndFunc

Func Graphic($hGraphics, $x, $y, $hBrush0, $hBrush1, $hBrush2, $hBrush3, $hBrush4)
    _GDIPlus_GraphicsFillRect($hGraphics, $x, $y, 72, 72, $hBrush0)
    _GDIPlus_GraphicsFillRect($hGraphics, $x + 8, $y + 8, 56, 56, $hBrush2)
    _GDIPlus_GraphicsFillRect($hGraphics, $x + 9, $y + 9, 54, 54, $hBrush3)
    _GDIPlus_GraphicsFillRect($hGraphics, $x + 10, $y + 10, 52, 52, $hBrush4)
EndFunc

Func GraphicHover($hGraphics, $x, $y, $hBrush0, $hBrush1, $hBrush2, $hBrush3, $hBrush4)
    _GDIPlus_GraphicsFillRect($hGraphics, $x, $y, 72, 72, $hBrush1)
    _GDIPlus_GraphicsFillRect($hGraphics, $x + 8, $y + 8, 56, 56, $hBrush2)
    _GDIPlus_GraphicsFillRect($hGraphics, $x + 9, $y + 9, 54, 54, $hBrush3)
    _GDIPlus_GraphicsFillRect($hGraphics, $x + 10, $y + 10, 52, 52, $hBrush4)
EndFunc

; Очищает ресурсы
;_GDIPlus_BrushDispose($hBrush)
;_GDIPlus_GraphicsDispose($hGraphics)
;_GDIPlus_Shutdown()
; ================================================================
Func WM_PAINT($hWnd)
	$iColorAero = '0x' & StringReplace(Hex(_WinAPI_DwmGetColorizationColor()), '00000000', '')
    Local $iArray = _ArrayFindAll($lParam, $hWnd)
	If Not @error Then
		For $n=0 to UBound($iArray) - 1
			Local $i = $iArray[$n]
			$hGraphics = $lParam[$i][1]
			$x = $lParam[$i][2]
			$y = $lParam[$i][3]
			$hBrush0 = $lParam[$i][4]
			$hBrush1 = $lParam[$i][5]
			$hBrush2 = $lParam[$i][6]
			$hBrush3 = $lParam[$i][7]
			$tRectF = _GDIPlus_RectFCreate($x + 10, $y + 10, 52, 52)
			$hBrush4 = _GDIPlus_LineBrushCreateFromRectWithAngle($tRectF, 0xFFFFFFFF, $iColorAero, 45)
			$lParam[$i][8] = $hBrush4
			Sleep(1)
			Graphic($hGraphics, $x, $y, $hBrush0, $hBrush1, $hBrush2, $hBrush3, $hBrush4)
		Next
	EndIf
    Return $GUI_RUNDEFMSG
EndFunc   ;==>MY_WM_PAINT

Func _Hover_Event($CtrlID)
    Local $i = _ArraySearch($lParam, $CtrlID)
	If Not @error Then
		$hGraphics = $lParam[$i][1]
		$x = $lParam[$i][2]
		$y = $lParam[$i][3]
		$hBrush0 = $lParam[$i][4]
		$hBrush1 = $lParam[$i][5]
		$hBrush2 = $lParam[$i][6]
		$hBrush3 = $lParam[$i][7]
		$hBrush4 = $lParam[$i][8]
		GraphicHover($hGraphics, $x, $y, $hBrush0, $hBrush1, $hBrush2, $hBrush3, $hBrush4)
	EndIf
EndFunc

Func _Primary_Event($CtrlID)
    Local $i = _ArraySearch($lParam, $CtrlID)
	If Not @error Then
		$hGraphics = $lParam[$i][1]
		$x = $lParam[$i][2]
		$y = $lParam[$i][3]
		$hBrush0 = $lParam[$i][4]
		$hBrush1 = $lParam[$i][5]
		$hBrush2 = $lParam[$i][6]
		$hBrush3 = $lParam[$i][7]
		$hBrush4 = $lParam[$i][8]
		Graphic($hGraphics, $x, $y, $hBrush0, $hBrush1, $hBrush2, $hBrush3, $hBrush4)
	EndIf
EndFunc


Применение:

Код:
#include <ButtonsWin.au3>
#include <GDIPlus.au3>
$gui0 = GUICreate("", 300, 150, 300, 300)
GUIRegisterMsg($WM_PAINT, 'WM_PAINT')
GUISetState()
ConsoleWrite('Создаем кнопки' & @CR)
ButtomActive(0, $GUI0, 21, 4)
ButtomActive(1, $GUI0, 93, 4)

Do
Until GUIGetMsg() = $GUI_EVENT_CLOSE

; Очищает ресурсы
_GDIPlus_BrushDispose($hBrush)
_GDIPlus_GraphicsDispose($hGraphics)
_GDIPlus_Shutdown()
 
Верх