Unterscheidung LeftClick und LeftDoubleClick bei EventType()

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
Batze
Beiträge: 1492
Registriert: 03.06.2005 21:58
Wohnort: Berlin
Kontaktdaten:

Beitrag von Batze »

Du brauchst doch garkein Waitwindowevent() für meine Version.
Ein wenig Code würde wohl mehr sagen. :allright:
Hier sind meine Codes (aber die Seite geht gerade nicht):
http://www.basicpure.de.vu
Benutzeravatar
ProgOldie
Beiträge: 236
Registriert: 19.05.2012 17:09
Computerausstattung: Windows11, Arduinos, Pi3, PureBasic 6.02

Re: Unterscheidung LeftClick und LeftDoubleClick bei EventTy

Beitrag 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".
Windows10 / PB5.70 / Arduino (-Due) / Raspberry Pi3 /Linux Mint 18
Benutzeravatar
RSBasic
Admin
Beiträge: 8047
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: Unterscheidung LeftClick und LeftDoubleClick bei EventTy

Beitrag von RSBasic »

Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7031
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Unterscheidung LeftClick und LeftDoubleClick bei EventTy

Beitrag 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.
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
Danilo
-= Anfänger =-
Beiträge: 2284
Registriert: 29.08.2004 03:07

Re: Unterscheidung LeftClick und LeftDoubleClick bei EventTy

Beitrag 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).
cya,
...Danilo
"Ein Genie besteht zu 10% aus Inspiration und zu 90% aus Transpiration" - Max Planck
Benutzeravatar
Shardik
Beiträge: 746
Registriert: 25.01.2005 12:19

Re: Unterscheidung LeftClick und LeftDoubleClick bei EventTy

Beitrag 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:
Benutzeravatar
Danilo
-= Anfänger =-
Beiträge: 2284
Registriert: 29.08.2004 03:07

Re: Unterscheidung LeftClick und LeftDoubleClick bei EventTy

Beitrag 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.
cya,
...Danilo
"Ein Genie besteht zu 10% aus Inspiration und zu 90% aus Transpiration" - Max Planck
Benutzeravatar
ProgOldie
Beiträge: 236
Registriert: 19.05.2012 17:09
Computerausstattung: Windows11, Arduinos, Pi3, PureBasic 6.02

Re: Unterscheidung LeftClick und LeftDoubleClick bei EventTy

Beitrag 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.
Windows10 / PB5.70 / Arduino (-Due) / Raspberry Pi3 /Linux Mint 18
Benutzeravatar
Danilo
-= Anfänger =-
Beiträge: 2284
Registriert: 29.08.2004 03:07

Re: Unterscheidung LeftClick und LeftDoubleClick bei EventTy

Beitrag 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.
cya,
...Danilo
"Ein Genie besteht zu 10% aus Inspiration und zu 90% aus Transpiration" - Max Planck
Benutzeravatar
Josh
Beiträge: 1028
Registriert: 04.08.2009 17:24

Re: Unterscheidung LeftClick und LeftDoubleClick bei EventTy

Beitrag 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.
Antworten