Hi,
ich bin auf der Suche, wie ich einen Doppelklick auf ein "GUICtrlCreateLabel" feststellen kann.
Geht das?
danke :tongue:
Hi,
ich bin auf der Suche, wie ich einen Doppelklick auf ein "GUICtrlCreateLabel" feststellen kann.
Geht das?
danke :tongue:
So, hier meine Lösung.
Die Doppelklickgeschwindigkeit kannst du bei Bedarf anpassen ( TimerDiff($start) ).
#include <GUIConstants.au3>
Opt("GUIOnEventMode", 1)
Opt("MouseCoordMode", 0) ; WICHTIG, Maus-Koordinaten relativ zum Fenster
Dim $start, $n = 0, $MousePos = True
Dim $lb_left = 144, $lb_top = 108, $lb_width = 36, $lb_height = 17
#Region ### START Koda GUI section ### Form=
$Form1 = GUICreate("Form1", 633, 454, -1, -1)
GUISetOnEvent($GUI_EVENT_CLOSE, "Form1Close")
GUISetOnEvent($GUI_EVENT_PRIMARYDOWN, '_PRdown')
GUISetOnEvent($GUI_EVENT_PRIMARYUP, '_PRup')
$Label1 = GUICtrlCreateLabel("Label1", $lb_left, $lb_top, $lb_width, $lb_height)
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###
While 1
Sleep(100)
WEnd
Func Form1Close()
Exit
EndFunc
Func _PRdown()
$pos = MouseGetPos()
If ($pos[0] >= $lb_left And $pos[0] <= $lb_left + $lb_width) And _
($pos[1] >= $lb_top +20 And $pos[1] <= $lb_top +20 + $lb_height) Then
$n += 1
$MousePos = True
If $n = 2 And (TimerDiff($start) < 120) Then
_LblDblClick()
Else
$start = TimerInit()
$n = 1
EndIf
Else
$MousePos = False
EndIf
EndFunc
Func _PRup()
If $MousePos Then
If $n = 2 Then
$n = 0
Else
$start = TimerInit()
EndIf
EndIf
EndFunc
Func _LblDblClick()
MsgBox(0, '', 'Hurra Doppelklick')
EndFunc
Danke nochmals, klappt einwandfrei
Mit dieser Variante läßt sich de facto ein Doppelklick auf jedes x-beliebige Control abfragen.
Die Doppelklickgeschwindigkeit könnte man auch aus der Einstellung des PC auslesen und verwenden. So reichts aber auch.
weisst du wie man dies macht
Jo,
[autoit]RegRead("HKEY_CURRENT_USER\Control Panel\Mouse", "DoubleClickSpeed")
[/autoit]Was jetzt noch perfekt wäre, wäre wenn man 2 Labels hat und bei beiden den Doppelklick abfangen kann, aber nur 1x deine Funktion zu nutzen. Also irgendwie die Variablen Höhe, Breite, ... übergeben
Nur wie
EDIT:
Leider kann ich keinen Button mehr anklicken
#include <GUIConstants.au3>
Opt("GUIOnEventMode", 1)
Opt("MouseCoordMode", 0) ; WICHTIG, Maus-Koordinaten relativ zum Fenster
Dim $start, $n = 0, $MousePos = True
Dim $lb_left = 244, $lb_top = 108, $lb_width = 36, $lb_height = 17
Dim $lb_left2 = 244, $lb_top2 = 18, $lb_width2 = 36, $lb_height2 = 17
#Region ### START Koda GUI section ### Form=
$Form1 = GUICreate("Form1", 433, 154, -1, -1)
GUISetOnEvent($GUI_EVENT_CLOSE, "Form1Close")
GUISetOnEvent($GUI_EVENT_PRIMARYDOWN, '_PRdown')
GUISetOnEvent($GUI_EVENT_PRIMARYUP, '_PRup')
$Label1 = GUICtrlCreateLabel("Label1", $lb_left, $lb_top, $lb_width, $lb_height)
$Label1 = GUICtrlCreateLabel("Label2", $lb_left2, $lb_top2, $lb_width2, $lb_height2)
$beenden = GUICtrlCreateButton("beenden", 40, 10, 50, 50, $BS_ICON)
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###
While 1
$msg = GUIGetMsg()
Select
Case $msg = $beenden
Exit
EndSelect
WEnd
Func Form1Close()
Exit
EndFunc
Func _PRdown()
$pos = MouseGetPos()
If ($pos[0] >= $lb_left And $pos[0] <= $lb_left + $lb_width) And _
($pos[1] >= $lb_top +20 And $pos[1] <= $lb_top +20 + $lb_height) Then
$n += 1
$MousePos = True
If $n = 2 And (TimerDiff($start) < 120) Then
_LblDblClick()
Else
$start = TimerInit()
$n = 1
EndIf
Else
$MousePos = False
EndIf
EndFunc
Func _PRup()
If $MousePos Then
If $n = 2 Then
$n = 0
Else
$start = TimerInit()
EndIf
EndIf
EndFunc
Func _LblDblClick()
MsgBox(0, '', 'Hurra Doppelklick')
EndFunc
Dazu mußt du nach Position differenzieren.
Also innerhalb der PRIMARYDOWN-Funktion eine erweiterte IF-Abfrage mit den Koordinaten des anderen Labels.
Versuch dich mal, wenns nichts wird melde dich wieder
So nun auch mit mehren Labels, aber nur 1x die Funktion von BugFix.
#include <GUIConstants.au3>
Opt("GUIOnEventMode", 1)
Opt("MouseCoordMode", 0) ; WICHTIG, Maus-Koordinaten relativ zum Fenster
Dim $start, $n = 0, $MousePos = True
Dim $lb_left[1000], $lb_top[1000], $lb_width[1000], $lb_height[1000]
$lb_left[1] = 244
$lb_top[1] = 108
$lb_width[1] = 36
$lb_height[1] = 17
$lb_left[2] = 244
$lb_top[2] = 18
$lb_width[2] = 36
$lb_height[2] = 17
#Region ### START Koda GUI section ### Form=
$Form1 = GUICreate("Form1", 433, 154, -1, -1)
GUISetOnEvent($GUI_EVENT_CLOSE, "Form1Close")
GUISetOnEvent($GUI_EVENT_PRIMARYDOWN, '_PRdown')
GUISetOnEvent($GUI_EVENT_PRIMARYUP, '_PRup')
$Label1 = GUICtrlCreateLabel("Label1", $lb_left[1], $lb_top[1], $lb_width[1], $lb_height[1])
$Label1 = GUICtrlCreateLabel("Label2", $lb_left[2], $lb_top[2], $lb_width[2], $lb_height[2])
$beenden = GUICtrlCreateButton("beenden", 40, 10, 50, 50, $BS_ICON)
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###
While 1
$msg = GUIGetMsg()
Select
Case $msg = $beenden
Exit
EndSelect
WEnd
Func Form1Close()
Exit
EndFunc
Func _PRdown()
$pos = MouseGetPos()
For $i = 1 to 2
If ($pos[0] >= $lb_left[$i] And $pos[0] <= $lb_left[$i] + $lb_width[$i]) And _
($pos[1] >= $lb_top[$i] +20 And $pos[1] <= $lb_top[$i] +20 + $lb_height[$i]) Then
$n += 1
$MousePos = True
If $n = 2 And (TimerDiff($start) < 120) Then
_LblDblClick($i)
Else
$start = TimerInit()
$n = 1
EndIf
Else
$MousePos = False
EndIf
Next
EndFunc
Func _PRup()
If $MousePos Then
If $n = 2 Then
$n = 0
Else
$start = TimerInit()
EndIf
EndIf
EndFunc
Func _LblDblClick($i)
Select
Case $i = 1
MsgBox(0, $i, 'Hurra Doppelklick 1. Button')
Case $i = 2
MsgBox(0, $i, 'Hurra Doppelklick 2. Button')
EndSelect
EndFunc
Nur noch das Problem mit dem Button :comp2:
Stichwort: OnEvent - Mode
#include <GUIConstants.au3>
Opt("GUIOnEventMode", 1)
Opt("MouseCoordMode", 0) ; WICHTIG, Maus-Koordinaten relativ zum Fenster
Dim $start, $n = 0, $MousePos = True
Dim $lb_left[1000], $lb_top[1000], $lb_width[1000], $lb_height[1000]
$lb_left[1] = 244
$lb_top[1] = 108
$lb_width[1] = 36
$lb_height[1] = 17
$lb_left[2] = 244
$lb_top[2] = 18
$lb_width[2] = 36
$lb_height[2] = 17
#Region ### START Koda GUI section ### Form=
$Form1 = GUICreate("Form1", 433, 154, -1, -1)
GUISetOnEvent($GUI_EVENT_CLOSE, "_ende")
GUISetOnEvent($GUI_EVENT_PRIMARYDOWN, '_PRdown')
GUISetOnEvent($GUI_EVENT_PRIMARYUP, '_PRup')
$Label1 = GUICtrlCreateLabel("Label1", $lb_left[1], $lb_top[1], $lb_width[1], $lb_height[1])
$Label1 = GUICtrlCreateLabel("Label2", $lb_left[2], $lb_top[2], $lb_width[2], $lb_height[2])
$beenden = GUICtrlCreateButton("beenden", 40, 10, 50, 50, $BS_ICON)
GUICtrlSetOnEvent(-1, '_ende')
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###
While 1
Sleep(100)
WEnd
Func _ende()
Exit
EndFunc
Func _PRdown()
$pos = MouseGetPos()
For $i = 1 to 2
If ($pos[0] >= $lb_left[$i] And $pos[0] <= $lb_left[$i] + $lb_width[$i]) And _
($pos[1] >= $lb_top[$i] +20 And $pos[1] <= $lb_top[$i] +20 + $lb_height[$i]) Then
$n += 1
$MousePos = True
If $n = 2 And (TimerDiff($start) < 120) Then
_LblDblClick($i)
Else
$start = TimerInit()
$n = 1
EndIf
Else
$MousePos = False
EndIf
Next
EndFunc
Func _PRup()
If $MousePos Then
If $n = 2 Then
$n = 0
Else
$start = TimerInit()
EndIf
EndIf
EndFunc
Func _LblDblClick($i)
Select
Case $i = 1
MsgBox(0, $i, 'Hurra Doppelklick 1. Button')
Case $i = 2
MsgBox(0, $i, 'Hurra Doppelklick 2. Button')
EndSelect
EndFunc
Funktioniert deine Funktion auch wenn ich ohne OnEvent - Mode arbeite
Was spricht für OnEvent - Mode bzw. GUIGetmsg
Man kann dies auch mit GUIGetMsg verwenden, allerdings nicht zu empfehlen, da eine Vermischung von GUIGetMsg und OnEvent zu unvorhersehbaren Ergebnissen führen kann (s. dein Problem mit dem Button).
OnEvent ist, gerade bei größeren Projekten, wesentlich übersichtlicher.
Jedem Event wird eine Funktion zugewiesen. Das ist vor allem bei der Arbeit mit mehreren GUI wesentlich effektiver zu programmieren als mit der GUIGetMsg-Methode.
Ich kann OnEvent nur empfehlen.
Danke, nun läufts.
Hab noch das auslesen der Doppelklickgeschwindigkeit hinzugefügt.
#include <GUIConstants.au3>
Opt("MouseCoordMode", 0) ; WICHTIG, Maus-Koordinaten relativ zum Fenster
Dim $start, $n = 0, $MousePos = True
Dim $lb_left[1000], $lb_top[1000], $lb_width[1000], $lb_height[1000]
$lb_left[1] = 244
$lb_top[1] = 108
$lb_width[1] = 36
$lb_height[1] = 17
$lb_left[2] = 244
$lb_top[2] = 18
$lb_width[2] = 36
$lb_height[2] = 17
#Region ### START Koda GUI section ### Form=
$Form1 = GUICreate("Form1", 433, 154, -1, -1)
$Label1 = GUICtrlCreateLabel("Label1", $lb_left[1], $lb_top[1], $lb_width[1], $lb_height[1])
$Label1 = GUICtrlCreateLabel("Label2", $lb_left[2], $lb_top[2], $lb_width[2], $lb_height[2])
$beenden = GUICtrlCreateButton("beenden", 40, 10, 50, 50)
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###
$clickspeed = RegRead("HKEY_CURRENT_USER\Control Panel\Mouse", "DoubleClickSpeed")
While 1
$msg = GUIGetMsg()
Select
Case $msg = $beenden
_ende()
Case $msg = $GUI_EVENT_PRIMARYDOWN
_PRdown()
Case $msg = $GUI_EVENT_PRIMARYUP
_PRup()
EndSelect
WEnd
Func _ende()
Exit
EndFunc
Func _PRdown()
$pos = MouseGetPos()
For $i = 1 to 2
If ($pos[0] >= $lb_left[$i] And $pos[0] <= $lb_left[$i] + $lb_width[$i]) And _
($pos[1] >= $lb_top[$i] +20 And $pos[1] <= $lb_top[$i] +20 + $lb_height[$i]) Then
$n += 1
$MousePos = True
If $n = 2 And (TimerDiff($start) < $clickspeed) Then
_LblDblClick($i)
Else
$start = TimerInit()
$n = 1
EndIf
Else
$MousePos = False
EndIf
Next
EndFunc
Func _PRup()
If $MousePos Then
If $n = 2 Then
$n = 0
Else
$start = TimerInit()
EndIf
EndIf
EndFunc
Func _LblDblClick($i)
Select
Case $i = 1
MsgBox(0, $i, 'Hurra Doppelklick 1. Button')
Case $i = 2
MsgBox(0, $i, 'Hurra Doppelklick 2. Button')
EndSelect
EndFunc
Ich nehme immer GUIGetMsg(), weil ich dann z. B. einem Button 2 Funktionen hintereinander ablaufen lassen kann
ZitatOriginal von Tweaky
Ich nehme immer GUIGetMsg(), weil ich dann z. B. einem Button 2 Funktionen hintereinander ablaufen lassen kann
Das geht doch im OnEvent-Mode genauso:
[autoit]$button = GUICtrlCreateButton()
GUICtrlSetOnEvent(-1, '_$button')
;
;
Func _button()
Func1()
Func2()
; usw.
EndFunc
:DOK, hast recht
Ich hab das mal noch etwas komfortabler gestaltet. Du übergibst jetzt Name der GUI und des zu prüfenden Controls an eine Checkfunktion. Damit ist es einfacher, das für viele Controls (auch auf unterschiedlichen GUI) auszuwerten.
Und die Größenparameter der Controls brauchen nicht separat abgespeichert werden.
#include <array.au3>
#include <GUIConstants.au3>
Opt("GUIOnEventMode", 1)
Opt("MouseCoordMode", 0) ; WICHTIG, Maus-Koordinaten relativ zum Fenster
Dim $start, $n = 0, $MousePos = True, $pos
Dim $clickspeed = RegRead("HKEY_CURRENT_USER\Control Panel\Mouse", "DoubleClickSpeed")
$Form1 = GUICreate("Form1", 633, 454, -1, -1)
GUISetOnEvent($GUI_EVENT_CLOSE, "Form1Close")
GUISetOnEvent($GUI_EVENT_PRIMARYDOWN, '_PRdown')
GUISetOnEvent($GUI_EVENT_PRIMARYUP, '_PRup')
$Label1 = GUICtrlCreateLabel("Label1", 144, 108, 36, 17)
$Label2 = GUICtrlCreateLabel("Label2", 144, 148, 36, 17)
GUISetState(@SW_SHOW)
While 1
Sleep(100)
WEnd
Func Form1Close()
Exit
EndFunc
Func _PRdown()
$pos = MouseGetPos()
If _CheckCtrlDblClick($Form1, $Label1) Then
_LblDblClick()
ElseIf _CheckCtrlDblClick($Form1, $Label2) Then
_LblDblClick2()
Else
$MousePos = False
EndIf
EndFunc
Func _PRup()
If $MousePos Then
If $n = 2 Then
$n = 0
Else
$start = TimerInit()
EndIf
EndIf
EndFunc
Func _LblDblClick()
MsgBox(0, '', 'Doppelklick Label 1')
EndFunc
Func _LblDblClick2()
MsgBox(0, '', 'Doppelklick Label 2')
EndFunc
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