Seite 2 von 3

Verfasst: 05.08.2005 16:01
von Batze
Du brauchst doch garkein Waitwindowevent() für meine Version.
Ein wenig Code würde wohl mehr sagen. :allright:

Re: Unterscheidung LeftClick und LeftDoubleClick bei EventTy

Verfasst: 25.03.2015 09:18
von ProgOldie
Gibt es inzwischen eine stets funktionierende Lösung in Gestalt einer Prozedur, die den Eventtyp so zurückcht, dass bei Doppelklick wirklich nur Doppelklick zurückgereicht wird? In allen übrigen Fällen soll der Eventtyp zurückgereicht werden.
Hintergrund: Wenn ich z.B. auf ein Listicongadget klicke, will ich bei Single- bzw. Doppeklick ganz unterschiedliche Ereignisse auslösen.

Das ist doch eine ganz grundlegende Aufgabe, die Windows dauernd erledigt.
Danke für das Einlesen in dieses "Oldie-Problem".

Re: Unterscheidung LeftClick und LeftDoubleClick bei EventTy

Verfasst: 25.03.2015 10:57
von RSBasic

Re: Unterscheidung LeftClick und LeftDoubleClick bei EventTy

Verfasst: 25.03.2015 11:27
von STARGÅTE
ProgOldie hat geschrieben:Hintergrund: Wenn ich z.B. auf ein Listicongadget klicke, will ich bei Single- bzw. Doppeklick ganz unterschiedliche Ereignisse auslösen.Das ist doch eine ganz grundlegende Aufgabe, die Windows dauernd erledigt.Danke für das Einlesen in dieses "Oldie-Problem".
Das stimmt. Bei Windows wird mit einem EinfachKlick eine Datei ausgewählt und mit einem DoppelKlick eine Datei geöffnet.
Aber auch unter Windows wird eine Datei immer zuerst ausgewählt und dann geöffnet, wenn ein DoppelKlick kommt.
Auch hier wird der EinfachKlick also nicht ignoriert.
ProgOldie hat geschrieben:Gibt es inzwischen eine stets funktionierende Lösung in Gestalt einer Prozedur, die den Eventtyp so zurückcht, dass bei Doppelklick wirklich nur Doppelklick zurückgereicht wird? In allen übrigen Fällen soll der Eventtyp zurückgereicht werden.
Ich glaube nicht, dass eine solche Lösung zu deiner zufriedenheit wäre, denn:
Das würde ja bedeuten, dass jeder EinfachKlick immer eine Aktionsverzögerung von mindestens DoubleClickTime() hat, was je nach Benutzer von 200ms bis 1000ms dauern kann, was für den nutzer dann extrem nertig sein kann.
Denn wie gesagt, du weißt vllt wann du ein Doppelklick machst, aber das Programm nicht.

Re: Unterscheidung LeftClick und LeftDoubleClick bei EventTy

Verfasst: 25.03.2015 12:18
von Danilo
STARGÅTE hat geschrieben:Ich glaube nicht, dass eine solche Lösung zu deiner zufriedenheit wäre, denn:
Das würde ja bedeuten, dass jeder EinfachKlick immer eine Aktionsverzögerung von mindestens DoubleClickTime() hat, was je nach Benutzer von 200ms bis 1000ms dauern kann, was für den nutzer dann extrem nertig sein kann.
Denn wie gesagt, du weißt vllt wann du ein Doppelklick machst, aber das Programm nicht.
Ist tatsächlich blöd, wenn ein Einfachklick erst verspätet ausgewertet wird.

Code: Alles auswählen

mouseDblClickTime = GetDoubleClickTime_()
Debug mouseDblClickTime

Enumeration 1
    #SingleClick
    #DoubleClick
EndEnumeration

Global clickType

Procedure OnClickTimer()
    RemoveWindowTimer(0,1)
    If clickType = #SingleClick
        Debug "Single Click"
    ElseIf clickType = #DoubleClick
        Debug "Double Click"
    EndIf
    clickType = 0
EndProcedure

Procedure OnLeftClick()
    If clickType <> #DoubleClick
        clickType = #SingleClick
        AddWindowTimer(0,1,GetDoubleClickTime_()+20)
    EndIf
EndProcedure

Procedure OnLeftDblClick()
    clickType = #DoubleClick
EndProcedure

If OpenWindow(0, 0, 0, 300, 200, "ListIcon Example", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
    ListIconGadget(0, 5, 5, 290, 190, "Name", 100, #PB_ListIcon_FullRowSelect | #PB_ListIcon_AlwaysShowSelection)
    AddGadgetColumn(0, 1, "Address", 250)
    AddGadgetItem(0, -1, "Harry Rannit"+Chr(10)+"12 Parliament Way, Battle Street, By the Bay")
    AddGadgetItem(0, -1, "Ginger Brokeit"+Chr(10)+"130 PureBasic Road, BigTown, CodeCity")
    
    BindGadgetEvent(0,@OnLeftClick()   ,#PB_EventType_LeftClick)
    BindGadgetEvent(0,@OnLeftDblClick(),#PB_EventType_LeftDoubleClick)
    
    BindEvent(#PB_Event_Timer,@OnClickTimer(),0,1)
    
    Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
EndIf

Allerdings sagt MSDN auch, dass ein Einfachklick eine Aktion ausführt, und eine später eintreffende Doppelklickbenachrichtigung die Einzelklick-Aktion erweitert:

- MSDN: About Mouse Input >> Client Area Mouse Messages >> Double-Click Messages
A double-click message is always the third message in a four-message series. The first two messages are the button-down and button-up messages generated by the first click.
The second click generates the double-click message followed by another button-up message. For example, double-clicking the left mouse button generates the following message sequence:

1. WM_LBUTTONDOWN
2. WM_LBUTTONUP
3. WM_LBUTTONDBLCLK
4. WM_LBUTTONUP

Because a window always receives a button-down message before receiving a double-click message, an application typically uses a double-click message to extend a task it began during a button-down message.
For example, when the user clicks a color in the color palette of Microsoft Paint, Paint displays the selected color next to the palette. When the user double-clicks a color, Paint displays the color and opens the Edit Colors dialog box.
Ein Einzelklick in einem ListIconGadget sollte einen Eintrag auswählen, und ein Doppelklick könnte dann eine erweiterte Funktion sein (Dialog öffnen etc).

Re: Unterscheidung LeftClick und LeftDoubleClick bei EventTy

Verfasst: 25.03.2015 14:47
von Shardik
Mit PB 4.60 wurde die plattform-unabhängige PB-Funktion DoubleClickTime() zur Ermittlung des Doppelklick-Zeitintervalls eingeführt, sodass es nicht mehr nötig ist, die Windows-spezifische API-Funktion GetDoubleClickTime_() zu verwenden... :wink:

Re: Unterscheidung LeftClick und LeftDoubleClick bei EventTy

Verfasst: 25.03.2015 15:05
von Danilo
Habe ich wohl verpasst, da ich diese Funktion nur sehr selten brauche. :)
Benutze sonst immer direkt #PB_EventType_LeftClick und #PB_EventType_LeftDoubleClick.

Re: Unterscheidung LeftClick und LeftDoubleClick bei EventTy

Verfasst: 25.03.2015 19:01
von ProgOldie
Danke erst einmal für die Erläuterungen. Danilos Programm funktioniert jedenfalls so wie ich es gern hätte. Allerdings hat Stargate recht, es bedeutet halt immer eine Verzögerung, und die kann man nicht umgehen.
Ich werde einmal testen, inwieweit man mit SetDoubleClickTime_() die Zeit von momentan 500ms (Voreinstellung) vielleicht noch heruntersetzen kann.
Ursprünglich hatte ich die Idee, mit WaitWindowEvent(DoubleClickTime()+10) eine Warteschleife einzubauen. Irgendwie hat das aber nicht geklappt.

Re: Unterscheidung LeftClick und LeftDoubleClick bei EventTy

Verfasst: 25.03.2015 19:22
von Danilo
Was möchtest Du denn bei Einfach- und Doppelklick machen? Laut MS sollten die beiden Funktionen logisch aufeinander aufbauen
oder sich ergänzen, und sich nicht gegenseitig ausschließen.

Re: Unterscheidung LeftClick und LeftDoubleClick bei EventTy

Verfasst: 25.03.2015 21:20
von Josh
ProgOldie hat geschrieben: Ich werde einmal testen, inwieweit man mit SetDoubleClickTime_() die Zeit von momentan 500ms (Voreinstellung) vielleicht noch heruntersetzen kann.
Ursprünglich hatte ich die Idee, mit WaitWindowEvent(DoubleClickTime()+10) eine Warteschleife einzubauen. Irgendwie hat das aber nicht geklappt.
Finde ich nicht gut. Wenn mir ein Programm meine Einstellungen in dieser Art verändern würde, dann wäre es die längste Zeit auf meiner Festplatte gewesen.