Что нового

Элементы GUI Как получить Control ID кнопок окна

aptyp

Новичок
Сообщения
36
Репутация
0
Как получить Control ID кнопок окна
$GUI_EVENT_CLOSE
$GUI_EVENT_MINIMIZE
$GUI_EVENT_RESTORE

Код:
#include <GUIConstantsEx.au3>
#include <WinAPIDlg.au3>

$Form1 = GUICreate("Форма 1")
$Button1 = GUICtrlCreateButton("Да", 140, 125, 50, 50)
$Button2 = GUICtrlCreateButton("Нет", 190, -1, 50, 50)

GUISetState(@SW_SHOW)

While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
        Case $GUI_EVENT_CLOSE
            MsgBox(0, 0, "ID=" & _WinAPI_GetDlgCtrlID(ControlGetHandle($Form1, "", $GUI_EVENT_CLOSE)) & " WinHandle=" & WinGetHandle($Form1) & " CtrlHandle=" & GUICtrlGetHandle($GUI_EVENT_CLOSE))
            Exit
        Case $GUI_EVENT_MINIMIZE
            MsgBox(0, 0, "ID=" & _WinAPI_GetDlgCtrlID(GUICtrlGetHandle($GUI_EVENT_MINIMIZE)) & " WinHandle=" & WinGetHandle($Form1) & " CtrlHandle=" & GUICtrlGetHandle($GUI_EVENT_MINIMIZE))
        Case $GUI_EVENT_RESTORE
            MsgBox(0, 0, "ID=" & _WinAPI_GetDlgCtrlID(GUICtrlGetHandle($GUI_EVENT_RESTORE)) & " WinHandle=" & WinGetHandle($Form1) & " CtrlHandle=" & GUICtrlGetHandle($GUI_EVENT_RESTORE))
        Case $Button1
            MsgBox(0, 0, "ID=" & _WinAPI_GetDlgCtrlID(GUICtrlGetHandle($Button1)) & " WinHandle=" & WinGetHandle($Form1) & " CtrlHandle=" & GUICtrlGetHandle($Button1))
        Case $Button2
            MsgBox(0, 0, "ID=" & _WinAPI_GetDlgCtrlID(GUICtrlGetHandle($Button2)) & " WinHandle=" & WinGetHandle($Form1) & " CtrlHandle=" & GUICtrlGetHandle($Button2))
    EndSwitch
WEnd
 

vovsla

Осваивающий
Сообщения
607
Репутация
36
Нужен именно ID или нужно получить события?
Код:
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
Opt("GUIOnEventMode", 1)
#Region ### START Koda GUI section ### Form=
$Form1 = GUICreate("Form1", 615, 437, 192, 124)
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###

GUIRegisterMsg($WM_NCLBUTTONDOWN, 'WM_NCLBUTTONDOWN')
GUIRegisterMsg($WM_SYSCOMMAND, 'WM_SYSCOMMAND')

While 1
    Sleep(100)
WEnd

Func WM_NCLBUTTONDOWN($hwnd, $iMsg, $iwParam, $ilParam)
    Switch $iwParam
        Case 0x8
            ConsoleWrite('ButtonMin'&@CRLF)
        Case 0x14
            GUIDelete()
            ConsoleWrite('Close'&@CRLF)
            Exit
    EndSwitch

    Return $GUI_RUNDEFMSG
EndFunc

Func WM_SYSCOMMAND($hwnd, $iMsg, $iwParam, $ilParam)
    Switch $iwParam
        Case 0xF020
            ConsoleWrite('Min'&@CRLF)
        Case 0xF120
            ConsoleWrite('Restore'&@CRLF)
    EndSwitch

    Return $GUI_RUNDEFMSG
EndFunc
 
Автор
aptyp

aptyp

Новичок
Сообщения
36
Репутация
0
Мощная тема.

Где есть примеры использования всех этих "WM_" Кодов сообщений Windows ?

А то без 0.5 не разберёшься )
Сообщение автоматически объединено:

Здеь вроде не все

 

vovsla

Осваивающий
Сообщения
607
Репутация
36
Мощная тема.

Где есть примеры использования всех этих "WM_" Кодов сообщений Windows ?

А то без 0.5 не разберёшься )
Сообщение автоматически объединено:

Здеь вроде не все


Я пользуюсь этими, примеры можно поискать по названию с помощью поисковиков
Код:
GUIRegisterMsg($WM_COMMAND, "WM_COMMAND")
GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY")
GUIRegisterMsg($WM_NCLBUTTONDOWN, 'WM_NCLBUTTONDOWN')
GUIRegisterMsg($WM_SYSCOMMAND, 'WM_SYSCOMMAND')
 
Автор
aptyp

aptyp

Новичок
Сообщения
36
Репутация
0
Кстати, вопрос.
Как получить Control ID кнопок окна [_][O][X]
без Opt("GUIOnEventMode", 1)

через GUIGetMsg()
?
Сообщение автоматически объединено:

Ведь в GUISetOnEvent уже есть макросы @GUI_CtrlId, @GUI_WinHandle, @GUI_CtrlHandle
 
Последнее редактирование:

Norm

Продвинутый
Сообщения
269
Репутация
70
Возможно Вам нужен не ID, а "сообщения" высылаемые этими кнопками.
Все они в виде констант записаны в .....\AutoIt3\Include\GUIConstantsEx.au3
Код:
Global Const $GUI_EVENT_NONE = 0
Global Const $GUI_EVENT_CLOSE = -3
Global Const $GUI_EVENT_MINIMIZE = -4
Global Const $GUI_EVENT_RESTORE = -5
Global Const $GUI_EVENT_MAXIMIZE = -6
Global Const $GUI_EVENT_PRIMARYDOWN = -7
Global Const $GUI_EVENT_PRIMARYUP = -8
Global Const $GUI_EVENT_SECONDARYDOWN = -9
Global Const $GUI_EVENT_SECONDARYUP = -10
Global Const $GUI_EVENT_MOUSEMOVE = -11
Global Const $GUI_EVENT_RESIZED = -12
Global Const $GUI_EVENT_DROPPED = -13
........
........

Ну или просто поросить показать
Код:
#include <GUIConstantsEx.au3>

MsgBox(0,Default,$GUI_EVENT_CLOSE)
 

vovsla

Осваивающий
Сообщения
607
Репутация
36
Зачем нужен Control ID, если нажатия на эти кнопки обрабатываются по WM командам?
 

Norm

Продвинутый
Сообщения
269
Репутация
70
Зачем нужен Control ID, если нажатия на эти кнопки обрабатываются по WM командам?
При нажатии на кнопу или, например, навидении указателея мыши на элемент GUI высылается сообщение и обработчик событий обрабатывает его.
А как узнать над каким элементом в данный момент находиляль мышь? Вот обработчик его и выясняет Control ID. Затем, зная ID-элемент, к нему можно обратиться, прочитать или помнять цвет и тд.
Но на самом деле нет нужды, всё пропускать через обработчик событий. Это специальный инструмент, котрый в боьшинстве случаев не нужен.

Более подробно это всё расписано в справке Концепция GUI
 

vovsla

Осваивающий
Сообщения
607
Репутация
36
При нажатии на кнопу или, например, навидении указателея мыши на элемент GUI высылается сообщение и обработчик событий обрабатывает его.
А как узнать над каким элементом в данный момент находиляль мышь? Вот обработчик его и выясняет Control ID. Затем, зная ID-элемент, к нему можно обратиться, прочитать или помнять цвет и тд.
Но на самом деле нет нужды, всё пропускать через обработчик событий. Это специальный инструмент, котрый в боьшинстве случаев не нужен.

Более подробно это всё расписано в справке Концепция GUI

Например вот так

Код:
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>

Opt("GUICloseOnESC", 1) ; ESC closes GUI
Opt("GUIOnEventMode", 1) ; Change to OnEvent mode
Opt('MustDeclareVars', 1)

HotKeySet("{ESC}", "_Exit")

Global $hMainWin



_Main()

Func _Main()

    $hMainWin = GUICreate("test", 300, 300)
    GUISetOnEvent($GUI_EVENT_CLOSE, "_Exit")

    GUICtrlCreateButton("Press", 10, 10, 80, 30)

    GUISetState()

    GUIRegisterMsg($WM_NOTIFY, "_WM_NOTIFY")

    While 1
        Sleep(10)
    WEnd



EndFunc   ;==>_Main

Func _WM_NOTIFY($hWnd, $iMsg, $iwParam, $ilParam)
    ConsoleWrite("+++: WM_NOTIFY(" & Hex($hWnd) & "|" & Hex($iMsg) & "|" & Hex($iwParam) & "|" & Hex($ilParam) & ") entered" & @CRLF)
EndFunc   ;==>WM_NOTIFY

Func _Exit()
    Exit
EndFunc
 

Norm

Продвинутый
Сообщения
269
Репутация
70
Например вот так
Всё верно,
но регистрировать и использовать обработчик событий для этого не целесообразно.
Код:
Opt("GUIOnEventMode", 1) ; Change to OnEvent mode
Opt('MustDeclareVars', 1)

HotKeySet("{ESC}", "_Exit")
Global $hMainWin

_Main()

Func _Main()
    $hMainWin = GUICreate("test", 300, 300)
    GUISetOnEvent(-3, "_Exit") ; -3 = $GUI_EVENT_CLOSE
    GUICtrlCreateButton("Press", 10, 10, 80, 30)
    GUICtrlSetOnEvent(-1, "_BtPressed")
    GUISetState(@SW_SHOW, $hMainWin)

    While 1
        Sleep(10)
    WEnd
EndFunc

Func _BtPressed()
    Local $ExInfo1 = ControlGetFocus($hMainWin) ; Class
    MsgBox(4096, "Нажата кнопка", "ID=" & @GUI_CtrlId & @CRLF &"Class=" & $ExInfo1 & @CRLF &"CtrlHandle=" & @GUI_CtrlHandle & @CRLF &"WinHandle=" & @GUI_WinHandle )
EndFunc

Func _Exit()
    Exit
EndFunc
Это для более тонких или специальных задач, которые обычным способом не решить.
И даже с обработчиком, после выяснения нужной информации, нужно как можно скорее покинуть обработчик.
И избегать вставки в него большого кода или внешних функций
Лично я часто цепляю на нужный GUI - элемент GUICtrlCreateDummy() ,
а в обработчике просто высылаю сообщение этому Dummy и выхожу из обработчика.
 
Последнее редактирование:

vovsla

Осваивающий
Сообщения
607
Репутация
36
Всё верно,
но регистрировать и использовать обработчик событий для этого не целесообразно.
Код:
Opt("GUIOnEventMode", 1) ; Change to OnEvent mode
Opt('MustDeclareVars', 1)

HotKeySet("{ESC}", "_Exit")
Global $hMainWin

_Main()

Func _Main()
    $hMainWin = GUICreate("test", 300, 300)
    GUISetOnEvent(-3, "_Exit") ; -3 = $GUI_EVENT_CLOSE
    GUICtrlCreateButton("Press", 10, 10, 80, 30)
    GUICtrlSetOnEvent(-1, "_BtPressed")
    GUISetState(@SW_SHOW, $hMainWin)

    While 1
        Sleep(10)
    WEnd
EndFunc

Func _BtPressed()
    Local $ExInfo1 = ControlGetFocus($hMainWin) ; Class
    MsgBox(4096, "Нажата кнопка", "ID=" & @GUI_CtrlId & @CRLF &"Class=" & $ExInfo1 & @CRLF &"CtrlHandle=" & @GUI_CtrlHandle & @CRLF &"WinHandle=" & @GUI_WinHandle )
EndFunc

Func _Exit()
    Exit
EndFunc
Это для более тонких или специальных задач, которые обычным способом не решить.
И даже с обработчиком, после выяснения нужной информации, нужно как можно скорее покинуть обработчик.
И избегать вставки в него большого кода или внешних функций
Лично я часто цепляю на нужный GUI - элемент GUICtrlCreateDummy() ,
а в обработчике просто высылаю сообщение этому Dummy и выхожу из обработчика.
Спасибо, буду знать, не знал, что грузить обработчик нежелательно. Только хотелось бы еще узнать почему
 
Верх