MouseEvent UDF

  • Hallo liebe AutoIt Comunity,
    wer schonmal mit Microsofts Visual Express SDK gearbeitet hat der weist das man dort ganz bequem für jedes erdenkliche GUI Event ein Event erstellen kann. (kliengt komisch ist aber so :D ) Daher habe ich nun mal mit den MouseEvents Angefangen und versucht sie in einer UDF nutzbar zu machen. Das ganze habe ich dann über einen EventHandler gelöst das Prinziep funktioniert ähnlich dem GUI Prinziep das mit GuiGetMsg die GUIMsg empfängt und je nach nachricht eine Aktion ausführt nur bekommt der EventHandler hier keine GUINachrichten sondern er bekommt mit wenn ein MouseEvent statt findet. Da es meine erste UDF ist biete ich um nachsicht was die Documentation angeht.

    Wenns euch gefällt oder nicht bin ich offen für Verbesserungsvorschläge,Lob und Konstruktive Kretik.

    Ausserdem werde ich versuchen sobald wie möglich Updates mit neuen Events rauszubringen.

    MfG Sortoc

    Die UDF

    Spoiler anzeigen
    [autoit]

    #region #CURRENT#
    ; _Register_MouseEvent
    ; _MouseEvent
    ; _UnRegister_MouseEvent
    #endregion #CURRENT#

    [/autoit] [autoit][/autoit] [autoit]

    #region Global Variables
    Global $aMouseEvent[6]
    #endregion Global Variables

    [/autoit] [autoit][/autoit] [autoit]

    ; #FUNCTION# ====================================================================================================================
    ; Name...........: _Register_MouseEvent
    ; Description ...: "Startet" MouseEvent
    ; Parameters ....: $hControl Handle zu dem Control
    ; $hGUI Handle zu dem GUI
    ; $sEventHandler Der Funktionsname des EventHandlers
    ; Author ........: Sortoc
    ; ===============================================================================================================================
    Func _Register_MouseEvent($hGUI, $hControl, $sEventHandler)
    $aMouseEvent[0] = $hGUI
    $aMouseEvent[1] = $hControl
    $aMouseEvent[2] = $sEventHandler
    EndFunc ;==>_Register_MouseEvent
    ; #FUNCTION# ====================================================================================================================
    ; Name...........: _MouseEvent
    ; Description ...: Fires the Events for the EventHandler
    ; Author ........: Sortoc
    ; ===============================================================================================================================
    Func _MouseEvent()
    If $aMouseEvent[0] = False Then Return 0
    Local $result = _MouseInfo($aMouseEvent[0], $aMouseEvent[1])
    _MouseEnter($result[4])
    _MouseLeave($result[4])
    _MouseDown($result)
    EndFunc ;==>_MouseEvent
    ; #FUNCTION# ====================================================================================================================
    ; Name...........: _UnRegister_MouseEvent
    ; Description ...: Fährt MouseEvent herunter
    ; Author ........: Sortoc
    ; ===============================================================================================================================
    Func _UnRegister_MouseEvent()
    $aMouseEvent[0] = False
    EndFunc ;==>_UnRegister_MouseEvent

    [/autoit] [autoit][/autoit] [autoit]

    ; #FUNCTION# ====================================================================================================================
    ; Name...........: Internal Functions
    ; Author ........: Sortoc
    ; ===============================================================================================================================
    Func _MouseInfo($hGUI, $hControl)
    Local $aGUIMouseInfo = GUIGetCursorInfo($hGUI)
    If IsArray($aGUIMouseInfo) Then Return $aGUIMouseInfo
    EndFunc ;==>_MouseInfo
    Func _MouseDown($result)
    If $aMouseEvent[4] = False Then
    If $result[2] = 1 Then
    Call($aMouseEvent[2], "MouseLeftDown")
    $aMouseEvent[4] = True
    EndIf
    Else
    Call($aMouseEvent[2], "MouseLeftUp")
    $aMouseEvent[4] = False
    EndIf
    If $aMouseEvent[5] = False Then
    If $result[3] = 1 Then
    Call($aMouseEvent[2], "MouseRightDown")
    $aMouseEvent[5] = True
    EndIf
    Else
    Call($aMouseEvent[2], "MouseRightUp")
    $aMouseEvent[5] = False
    EndIf
    EndFunc ;==>_MouseDown
    Func _MouseLeave($result)
    If $aMouseEvent[3] = True Then
    If $result <> $aMouseEvent[1] Then
    Call($aMouseEvent[2], "MouseLeave")
    $aMouseEvent[3] = False
    EndIf
    EndIf
    EndFunc ;==>_MouseLeave
    Func _MouseEnter($result)
    If $aMouseEvent[3] = False Then
    If $result = $aMouseEvent[1] Then
    Call($aMouseEvent[2], "MouseEnter")
    $aMouseEvent[3] = True
    EndIf
    EndIf
    EndFunc ;==>_MouseEnter

    [/autoit]


    Ein Beispiel

    Spoiler anzeigen
    [autoit]

    #include <MouseEvent.au3>

    [/autoit] [autoit][/autoit] [autoit]

    $hGUI = GUICreate("Test", 200, 200)
    $btn_Test = GUICtrlCreateButton("Test", 10, 10, 180, 180)
    GUICtrlSetCursor($btn_Test, 0)
    GUISetState()

    [/autoit] [autoit][/autoit] [autoit]

    _Register_MouseEvent($hGUI, $btn_Test, "EventHandler") ;"Startet" MouseEvent

    [/autoit] [autoit][/autoit] [autoit]

    While Sleep(50)
    _MouseEvent()
    GUIEventHandler(GUIGetMsg()) ;Das EventHandler prinziep funktioniert natürlich auch mit GUIGetMsg allerdings sollte man für die GUI einen
    ;eigene EventHandler nehmen da dieser jeden schleifen Durchgang Aufgerufen wird und deshalb den MouseEventHandler stören kann
    WEnd

    [/autoit] [autoit][/autoit] [autoit]

    Func EventHandler($Event) ;Definiert den EventHandler
    Switch $Event
    Case "MouseLeave"
    GUICtrlSetFont($btn_Test, 8.5)
    Case "MouseEnter"
    GUICtrlSetFont($btn_Test, 45, Default, 8)
    Case "MouseLeftDown" ; Linke Maustaste gedrückt gehalten
    Case "MouseLeftUp" ; Linke Maustaste losgelassen
    Case "MouseRightDown" ; Rechte Maustaste gedrückt gehalten
    Case "MouseRightUp" ; Rechte Maustaste losgelassen
    Case -11 ; Maus bewegt sich
    ToolTip("MouseMove")
    EndSwitch
    EndFunc ;==>EventHandler
    Func GUIEventHandler($GUIEvent)
    If $GUIEvent = -11 Then Return EventHandler(-11)
    Switch $GUIEvent
    Case -3
    Exit
    Case $btn_Test
    MsgBox(0, "", "Button geklickt")
    EndSwitch
    EndFunc ;==>GUIEventHandler

    [/autoit]