Bei UDF's möchte man ja erreichen, dass möglichst viel in den UDF-Funktionen abläuft und der User dort nicht aktiv werden muss.
Bei Verwendung von grafischen Oberflächen erspart einem der OnEvent-Mode oft viel Schreibarbeit, einige Dinge lassen sich auch nur sinnvoll mit dem OnEvent-Mode lösen.
Nun kann ich ich natürlich festlegen: Anwendung dieser UDF ausschließlich im OnEvent-Mode.
Oder der User muss mir die Events zum Prüfen in die UDF weiterleiten (so, wie in meinem Bsp. unten).
Eine Möglichkeit wäre wohl auch, dass ich mich direkt in den Nachrichtenstrom des Userfensters einklinke und darüber auswerte. Wie handhabt ihr das so?
Hier mein Funktionsbeispiel
Die UDF:
AutoIt: guimsg_event.au3
Global Const $_GREEN = 0x22B14C
Global Const $_YELLOW = 0xFFF200
Global Const $_RED = 0xED1C24
Global $aCtrl[1][2] = [[0]] ; [0][0]=Zähler, [n][0]=ID / [n][1]=Farbstatus (0=grün, 1=gelb, 2=rot)
Func _MyButtonLabel($hWnd, $sText, $iX, $iY, $iW=Default, $iH=Default)
GUISwitch($hWnd)
Local $iID = GUICtrlCreateLabel($sText, $iX, $iY, $iW, $iH, BitOR(0x01, 0x0200)) ; CENTER + CENTERIMAGE
GUICtrlSetBkColor(-1, $_GREEN)
__AddID($iID)
If Opt("GUIOnEventMode") = 1 Then
GUICtrlSetOnEvent(-1, _MyButtonLabelClick_OnEvent)
EndIf
Return $iID
EndFunc
Func _MyButtonLabelClick_OnEvent()
Local $Index = __GetIndex(@GUI_CtrlId)
If $Index = -1 Then Return
ConsoleWrite('OnEvent - Mode' & @CRLF)
__ChangeLabelColor($Index)
EndFunc
Func _MyButtonLabelClick_GetMsg($iMsg)
Local $Index = __GetIndex($iMsg)
If $Index = -1 Then Return
ConsoleWrite('GuiGetMsg - Mode' & @CRLF)
__ChangeLabelColor($Index)
EndFunc
Func __ChangeLabelColor($iIndex)
Local Static $aColor[] = [$_GREEN, $_YELLOW, $_RED]
$aCtrl[$iIndex][1] += 1
If $aCtrl[$iIndex][1] = 3 Then $aCtrl[$iIndex][1] = 0
GUICtrlSetBkColor($aCtrl[$iIndex][0], $aColor[$aCtrl[$iIndex][1]])
EndFunc
Func __AddID($_ID)
$aCtrl[0][0] += 1
ReDim $aCtrl[$aCtrl[0][0]+1][2]
$aCtrl[$aCtrl[0][0]][0] = $_ID
$aCtrl[$aCtrl[0][0]][1] = 0
EndFunc
Func __GetIndex($_ID)
If $aCtrl[0][0] = 0 Then Return -1
For $i = 1 To $aCtrl[0][0]
If $aCtrl[$i][0] = $_ID Then Return $i
Next
Return -1
EndFunc
Alles anzeigen
Die Anwendung:
AutoIt: test_msg_evt.au3
#include 'guimsg_event.au3'
_Example_GuiGetMsg()
_Example_OnEvent()
Func _Example_GuiGetMsg()
Local $hGui = GUICreate('Test GuiGetMsg')
_MyButtonLabel($hGui, 'Button 1', 20, 20, 80, 30)
_MyButtonLabel($hGui, 'Button 2', 120, 20, 80, 30)
_MyButtonLabel($hGui, 'Button 3', 20, 60, 80, 30)
_MyButtonLabel($hGui, 'Button 4', 120, 60, 80, 30)
GUISetState()
Local $iMsg
While True
$iMsg = GUIGetMsg()
_MyButtonLabelClick_GetMsg($iMsg)
If $iMsg = -3 Then ExitLoop
WEnd
EndFunc
Func _Example_OnEvent()
Opt('GUIOnEventMode', 1)
Local $hGui = GUICreate('Test OnEvent')
GUISetOnEvent(-3, _Exit)
_MyButtonLabel($hGui, 'Button 1', 20, 20, 80, 30)
_MyButtonLabel($hGui, 'Button 2', 120, 20, 80, 30)
_MyButtonLabel($hGui, 'Button 3', 20, 60, 80, 30)
_MyButtonLabel($hGui, 'Button 4', 120, 60, 80, 30)
GUISetState()
While True
Sleep(50)
WEnd
EndFunc
Func _Exit()
Exit
EndFunc
Alles anzeigen