#include <GUIConstantsEx.au3>
#include <GuiButton.au3>
#include <WindowsConstants.au3>

Global $btn, $rdo, $chk, $iMemo

; Примечание: возвращаемый дескриптор этой кнопки не может быть прочитан с помощью функции GuiCtrlRead

_Main()

Func _Main()
	Local $hGUI

	$hGUI = GUICreate("Создание кнопки", 400, 400)
	$iMemo = GUICtrlCreateEdit("", 119, 10, 276, 374, $WS_VSCROLL)
	GUICtrlSetFont($iMemo, 9, 400, 0, "Courier New")

	$btn = _GUICtrlButton_Create($hGUI, "Кнопка1", 10, 10, 90, 50)

	$rdo = _GUICtrlButton_Create($hGUI, "Радио1", 10, 80, 90, 50, $BS_AUTORADIOBUTTON)

	$chk = _GUICtrlButton_Create($hGUI, "Check1", 10, 130, 90, 50, $BS_AUTO3STATE)

	GUIRegisterMsg($WM_COMMAND, "WM_COMMAND")
	GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY")

	GUISetState()

	MemoWrite("Дескриптор Кнопка1: " & $btn)
	MemoWrite("Дескриптор Радио1 : " & $rdo)
	MemoWrite("Дескриптор Check1 : " & $chk & @CRLF)

	While 1
		Switch GUIGetMsg()
			Case $GUI_EVENT_CLOSE
				ExitLoop
		EndSwitch
	WEnd

	Exit

EndFunc   ;==>_Main


; Записывает строку в элемент для заметок
Func MemoWrite($sMessage)
	GUICtrlSetData($iMemo, $sMessage & @CRLF, 1)
EndFunc   ;==>MemoWrite

Func WM_NOTIFY($hWnd, $Msg, $wParam, $lParam)
	#forceref $hWnd, $Msg, $wParam
	Local Const $BCN_HOTITEMCHANGE = -1249
	Local $tNMBHOTITEM = DllStructCreate("hwnd hWndFrom;int IDFrom;int Code;dword dwFlags", $lParam)
	Local $nNotifyCode = DllStructGetData($tNMBHOTITEM, "Code")
	Local $nID = DllStructGetData($tNMBHOTITEM, "IDFrom")
	Local $hCtrl = DllStructGetData($tNMBHOTITEM, "hWndFrom")
	Local $dwFlags = DllStructGetData($tNMBHOTITEM, "dwFlags")
	Local $sText = ""

	Switch $nNotifyCode
		Case $BCN_HOTITEMCHANGE ; Win XP и выше
			If BitAND($dwFlags, 0x10) = 0x10 Then
				$sText = "$BCN_HOTITEMCHANGE - Наведено: " & @CRLF

			ElseIf BitAND($dwFlags, 0x20) = 0x20 Then
				$sText = "$BCN_HOTITEMCHANGE - Оставлено: " & @CRLF
			EndIf
			MemoWrite($sText & _
					"-----------------------------" & @CRLF & _
					"WM_NOTIFY - информация:" & @CRLF & _
					"-----------------------------" & @CRLF & _
					"Код уведомления" & @TAB & $nNotifyCode & @CRLF & _
					"Идентификатор.." & @TAB & $nID & @CRLF & _
					"Дескриптор ...." & @TAB & $hCtrl & @CRLF & _
					"Текст кнопки .." & @TAB & _GUICtrlButton_GetText($hCtrl) & @CRLF)
	EndSwitch
	Return $GUI_RUNDEFMSG
EndFunc   ;==>WM_NOTIFY

; Реакция на нажатие кнопки
Func WM_COMMAND($hWnd, $Msg, $wParam, $lParam)
	#forceref $hWnd, $Msg
	Local $nNotifyCode = BitShift($wParam, 16)
	Local $nID = BitAND($wParam, 0x0000FFFF)
	Local $hCtrl = $lParam
	Local $sText = ""

	Switch $hCtrl
		Case $btn, $rdo, $chk
			Switch $nNotifyCode
				Case $BN_CLICKED
					$sText = "$BN_CLICKED"
				Case $BN_PAINT
					$sText = "$BN_PAINT"
				Case $BN_PUSHED, $BN_HILITE
					$sText = "$BN_PUSHED, $BN_HILITE"
				Case $BN_UNPUSHED, $BN_UNHILITE
					$sText = "$BN_UNPUSHED"
				Case $BN_DISABLE
					$sText = "$BN_DISABLE"
				Case $BN_DBLCLK, $BN_DOUBLECLICKED
					$sText = "$BN_DBLCLK, $BN_DOUBLECLICKED"
				Case $BN_SETFOCUS
					$sText = "$BN_SETFOCUS"
				Case $BN_KILLFOCUS
					$sText = "$BN_KILLFOCUS"
			EndSwitch
			MemoWrite( _
					"-----------------------------" & @CRLF & _
					"WM_COMMAND - информация:" & @CRLF & _
					"-----------------------------" & @CRLF & _
					"Код уведомления" & @TAB & $nNotifyCode & ', ' & $sText & @CRLF & _
					"Идентификатор.." & @TAB & $nID & @CRLF & _
					"Дескриптор ...." & @TAB & $hCtrl & @CRLF & _
					"Текст кнопки .." & @TAB & _GUICtrlButton_GetText($hCtrl) & @CRLF)
			Return 0 ; Только для теста нажатия кнопки
	EndSwitch
	; Продолжение обработчика внутренних команд AutoIt3.
	; Вы также можете завершить, используя строку с выходом из функции.
	; !!! Но только 'Return' (без значения) без продолжения
	; обработчика внутренних команд AutoIt3 в дальнейшем !!!
	Return $GUI_RUNDEFMSG
EndFunc   ;==>WM_COMMAND