Doppelklick für (fast) jedes Control

    • Offizieller Beitrag

    Manchmal möchte man einen Doppelklick auf ein Picture, Label usw. auswerten.
    Für diese Controls existiert aber standardmäßig kein Doppelklick-Ereignis.
    Mit dem folgenden Code könnt ihr jedes Control auf einen Doppelklick abfragen.
    Macht bei einem Button natürlich wenig Sinn ;).

    Viel Spaß damit:

    Spoiler anzeigen
    [autoit]

    #include <GUIConstants.au3>
    Opt("GUIOnEventMode", 1)
    Opt("MouseCoordMode", 0) ; Maus-Koordinaten relativ zum Fenster
    Global $start
    Global $n = 0
    Global $MousePos = True
    Global $pos
    Global $clickspeed = RegRead("HKEY_CURRENT_USER\Control Panel\Mouse", "DoubleClickSpeed")

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

    $Form1 = GUICreate("Form1", 400, 250, -1, -1)
    GUISetOnEvent($GUI_EVENT_CLOSE, "Form1Close")
    GUISetOnEvent($GUI_EVENT_PRIMARYDOWN, '_PRIMARYdown')
    GUISetOnEvent($GUI_EVENT_PRIMARYUP, '_PRIMARYup')
    $Label1 = GUICtrlCreateLabel("Label1", 30, 40, 40, 17, $SS_SUNKEN)
    $Label2 = GUICtrlCreateLabel("Label2", 30, 80, 40, 17, $SS_SUNKEN)
    $Input1 = GUICtrlCreateInput("Input1", 90, 40, 70, 20)
    $Input2 = GUICtrlCreateInput("Input2", 90, 80, 70, 20)
    $Group1 = GUICtrlCreateGroup("Group1", 190, 30, 190, 80)
    $Pic1 = GUICtrlCreatePic(@Systemdir & "\oobe\images\mslogo.jpg",100, 140, 200, 50)

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

    GUISetState(@SW_SHOW)

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

    While 1
    Sleep(100)
    WEnd

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

    Func Form1Close()
    Exit
    EndFunc

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

    #region DoubleClick Check
    Func _PRIMARYdown()
    $pos = MouseGetPos()
    Select
    Case _CheckCtrlDblClick($Form1, $Label1)
    _Lbl_1_DblClick()
    Case _CheckCtrlDblClick($Form1, $Label2)
    _Lbl_2_DblClick()
    Case _CheckCtrlDblClick($Form1, $Input1)
    _Inp_1_DblClick()
    Case _CheckCtrlDblClick($Form1, $Input2)
    _Inp_2_DblClick()
    Case _CheckCtrlDblClick($Form1, $Pic1)
    _Pic_1_DblClick()
    Case _CheckCtrlDblClick($Form1, $Group1)
    _Group_1_DblClick()
    Case Else
    $MousePos = False
    EndSelect
    EndFunc

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

    Func _PRIMARYup()
    If $MousePos Then
    If $n = 2 Then
    $n = 0
    Else
    $start = TimerInit()
    EndIf
    EndIf
    EndFunc

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

    Func _CheckCtrlDblClick($GUI, $CTRL)
    Local $CtrlPos = ControlGetPos($GUI, '', $CTRL)
    If ($pos[0] >= $CtrlPos[0] And $pos[0] <= $CtrlPos[0] + $CtrlPos[2]) And _
    ($pos[1] >= $CtrlPos[1] +20 And $pos[1] <= $CtrlPos[1] +20 + $CtrlPos[3]) Then
    $n += 1
    $MousePos = True
    If $n = 2 And (TimerDiff($start) < $clickspeed) Then
    Return True
    Else
    $start = TimerInit()
    $n = 1
    EndIf
    EndIf
    EndFunc
    #endregion DoubleClick Check
    #region DoubleClick Functions
    Func _Lbl_1_DblClick()
    MsgBox(0, '', 'Doubleclick Label 1')
    EndFunc

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

    Func _Lbl_2_DblClick()
    MsgBox(0, '', 'Doubleclick Label 2')
    EndFunc

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

    Func _Inp_1_DblClick()
    MsgBox(0, '', 'Doubleclick Input 1')
    EndFunc

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

    Func _Inp_2_DblClick()
    MsgBox(0, '', 'Doubleclick Input 2')
    EndFunc

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

    Func _Pic_1_DblClick()
    MsgBox(0, '', 'Doubleclick Picture 1')
    EndFunc

    Func _Group_1_DblClick()
    MsgBox(0, '', 'Doubleclick Group 1')
    EndFunc
    #endregion DoubleClick Functions

    [/autoit]
  • Ein Klick auf ein Control wird bei mir nur bei den Inputs und der Group registriert.
    Woran kann das liegen?

    GUI_EVENT_PRIMARYDOWN wird grundsätzlich in der GUI nur bei Klicks ausserhalb von Labels oder Pics erzeugt... :?:

  • Coole Sache.

    LG, Lina.

    Lieben Gruß,
    Alina

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    Geheime Information: ;)
    OuBVU5ebLhHu5QvlnAyQB4A7SzBrvWulwL7RLl2BdH5tI6sIYspeMKeXMSXl

    • Offizieller Beitrag
    Zitat

    Matschtaucher:
    GUI_EVENT_PRIMARYDOWN wird grundsätzlich in der GUI nur bei Klicks ausserhalb von Labels oder Pics erzeugt... :?:

    Wie kommst du darauf?
    Es existieren folgende GUI-Events:
    $GUI_EVENT_CLOSE
    $GUI_EVENT_MINIMIZE
    $GUI_EVENT_RESTORE
    $GUI_EVENT_MAXIMIZE
    $GUI_EVENT_MOUSEMOVE
    $GUI_EVENT_PRIMARYDOWN
    $GUI_EVENT_PRIMARYUP
    $GUI_EVENT_SECONDARYDOWN
    $GUI_EVENT_SECONDARYUP
    $GUI_EVENT_RESIZED
    $GUI_EVENT_DROPPED

    Und denen ist es gelinde gesagt Wurscht, ob und welche Controls sich auf der GUI befinden. Diese Ereignisse sind an die GUI gekoppelt, deshalb auch der Name GUI_EVENT_...

    Du schreibst, dass es bei dir nicht geht. Werd doch mal genauer. Funktioniert der hier gezeigte Code, so wie er ist, nicht? Oder hast du ihn verändert?

  • Also bei mir funktioniert es einfachfrei.

    Ich nutze sogar noch auf dem einen PC die vorletzte Version von AutoIt.

    Hast Du alle Includes? Also ich habe da ein Tool von Xenobiologist (hoffe Nick ist richtig geschrieben), das dieses prüft. "OrganizeIncludes AutoIt3 Version 3.0" heißt es. Ab und an lag da bei mir schon das Problem, das ich die Includes vergessen habe.

    OK, sonst kann ich gerade auch nicht wirklich weiterhelfen, auch wenn ich es gerne machen würde.

    LG, Lina.

    Lieben Gruß,
    Alina

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    Geheime Information: ;)
    OuBVU5ebLhHu5QvlnAyQB4A7SzBrvWulwL7RLl2BdH5tI6sIYspeMKeXMSXl