LeftDoubleClick bei TextGadget

Anfängerfragen zum Programmieren mit PureBasic.
Lord
Beiträge: 324
Registriert: 21.01.2008 19:11

LeftDoubleClick bei TextGadget

Beitrag von Lord »

Wenn ich es richtig gelesen habe, erhalte ich bei einem
Textgadget überhaupt keinen Event, da das Gadget nur
der Textanzeige dient. Fügt man das Flag #SS_NOTIFY
hinzu, werden auch für das Textgadget Events erzeugt.

Jedoch erhalte ich bei einem Doppelklick kein eindeutiges
Event. Es wird eine '0' für ein LeftDoubleClick und noch eine
'1' zurückgegeben, so daß es auch ein einfacher Links-
klick sein könnte.

Code: Alles auswählen

OpenWindow(1,0,0,200,400,"Test")


TextGadget(1, 10, 10, 180, 180,"TextGadget 1 - ohne #SS_NOTIFY",#PB_Text_Center|#PB_Text_Border)
TextGadget(2, 10,210, 180, 180,"TextGadget 2 - mit #SS_NOTIFY",#PB_Text_Center|#PB_Text_Border|#SS_NOTIFY)

Quit=#False

Repeat
  Event=WaitWindowEvent()
  EventGadget=EventGadget()
  EventType=EventType()

  Select Event
    Case #PB_Event_Gadget
      Select EventGadget
        Case 1
          Debug EventType
          ; kein Event
        Case 2
          Debug EventType
          ;0 bei LeftClick
          ;0 + 1 bei LeftDoubleClick
      EndSelect
    Case #PB_Event_CloseWindow
      Quit=#True
  EndSelect
  
Until Quit
Wie erhalte ich bei einem Textgadget eine eindeutige
Nachricht bei einem LeftDoubleClick?
Bild
Benutzeravatar
TomS
Beiträge: 1508
Registriert: 23.12.2005 12:41
Wohnort: München

Re: LeftDoubleClick bei TextGadget

Beitrag von TomS »

Gar nicht.
Zumindest nicht ohne Zeitverzögerung beim einzelnen Klick.
Ein Doppelklick besteht nunmal aus zwei Klicks. Und Windows hat keine Möglichkeit zu ermitteln, ob auf den ersten Klick noch einmal ein zweiter folgt, und zwar innerhalb der in der Systemsteuerung angegeben Zeit.
Also werden einfach beide Events gesendet.
Du musst also selber diesen Wert auslesen ( GetDoubleClickTime_() ) und erst nach Ablauf dieser Zeit auf die Klick-Events reagieren.
Kevin
Beiträge: 236
Registriert: 11.06.2007 12:55

Re: LeftDoubleClick bei TextGadget

Beitrag von Kevin »

wo ist das problem

Code: Alles auswählen

OpenWindow(1,0,0,200,400,"Test")


TextGadget(1, 10, 10, 180, 180,"TextGadget 1 - ohne #SS_NOTIFY",#PB_Text_Center|#PB_Text_Border)
TextGadget(2, 10,210, 180, 180,"TextGadget 2 - mit #SS_NOTIFY",#PB_Text_Center|#PB_Text_Border|#SS_NOTIFY)

Quit=#False

Repeat
  Event=WaitWindowEvent()
  EventGadget=EventGadget()
  EventType=EventType()

  Select Event
    Case #PB_Event_Gadget
      Select EventGadget
        Case 1
          Debug EventType
          ; kein Event
        Case 2
          Debug EventType
          ;0 bei LeftClick
          ;0 + 1 bei LeftDoubleClick
          If EventType=1
            Debug "LeftDoubleClick"
          EndIf
      EndSelect
    Case #PB_Event_CloseWindow
      Quit=#True
  EndSelect
  
Until Quit

edit:
Wie erhalte ich bei einem Textgadget eine eindeutige
Nachricht bei einem LeftDoubleClick?
du erhältst doch ein eindeutiges ergebnis
bei einem LeftDoubleClick bekommst du 1 zurück und 0 da es auch ein LeftClick ist
Lord
Beiträge: 324
Registriert: 21.01.2008 19:11

Re: LeftDoubleClick bei TextGadget

Beitrag von Lord »

Das Ergebnis ist nach meiner Ansicht eben nicht
eindeutig:

Code: Alles auswählen

OpenWindow(1,0,0,200,400,"Test")


TextGadget(1, 10, 10, 180, 180,"TextGadget 1 - ohne #SS_NOTIFY", #PB_Text_Center | #PB_Text_Border)
TextGadget(2, 10,210, 180, 180,"TextGadget 2 - mit #SS_NOTIFY", #PB_Text_Center | #PB_Text_Border | #SS_NOTIFY)

Quit=#False

Repeat
  Event=WaitWindowEvent()
  EventGadget=EventGadget()
  EventType=EventType()

  Select Event
    Case #PB_Event_Gadget
      Select EventGadget
        Case 1
          Debug EventType
          ; kein Event
        Case 2
        Select EventType
          Case 0
            Debug "LeftClick"
          Case 1
            Debug "LeftDoubleClick"
        EndSelect
        
      EndSelect
    Case #PB_Event_CloseWindow
      Quit=#True
  EndSelect
  
Until Quit
Es wird in einer normalen Eventverarbeitung sowohl
"LeftClick" als auch "LeftDoubleClick" ausgeführt.
Bild
Lord
Beiträge: 324
Registriert: 21.01.2008 19:11

Re: LeftDoubleClick bei TextGadget

Beitrag von Lord »

TomS hat geschrieben:Gar nicht.
Zumindest nicht ohne Zeitverzögerung beim einzelnen Klick.
Ein Doppelklick besteht nunmal aus zwei Klicks. Und Windows hat keine Möglichkeit zu ermitteln, ob auf den ersten Klick noch einmal ein zweiter folgt, und zwar innerhalb der in der Systemsteuerung angegeben Zeit.
Also werden einfach beide Events gesendet.
Du musst also selber diesen Wert auslesen ( GetDoubleClickTime_() ) und erst nach Ablauf dieser Zeit auf die Klick-Events reagieren.
Das verstehe ich nicht so ganz. Das BS kann doch
sehrwohl bei anderen Gadgets einen Doppelklick
feststellen und die entsprechende Nachricht generieren.

Wo müßte ich denn eine Verzögerung in meine Event-
schleife einbauen, damit ich diesen speziellen Fall ab-
fange? Es ist ja nicht so, daß es nur ein Gadget zu
verwalten gilt. Das Beispiel oben sollte nur den Fall
darstellen.
Bild
Benutzeravatar
TomS
Beiträge: 1508
Registriert: 23.12.2005 12:41
Wohnort: München

Re: LeftDoubleClick bei TextGadget

Beitrag von TomS »

Das BS kann doch
sehrwohl bei anderen Gadgets einen Doppelklick
feststellen und die entsprechende Nachricht generieren
Beispiel?
Die Verzögerung ist ja nicht viel. Bei mir sind das 500ms.
Aber diese Verzögerung braucht's ja nur, wenn man explizitzwei unterschiedliche Aktionen haben will, die sich gegenseitig beeinflussen oder ausschließen.
Z.B. Fenster1 und Fenster2 öffnen.
Der Normalfall ist aber dieser: Beispiel Desktop-Icon:
Einfachklick markiert das Icon, Doppelklick öffnet die Datei.
Beim Doppelklick zum öffnen ist es dir aber egal, ob das Icon blau hinterlegt wird.

Anderes Beispiel für offensichtlich unterschiedliche Aktionen:
Ein einfacher Klick auf einen Button setzt den Zähler um 1 höher. Ein Doppelklick soll 10 addieren.
Das ganze sieht dann so aus:

Code: Alles auswählen

Case #LeftClick : var+1
Case #LeftDoubleClick : var + 9
Oder: Beim einfachen Klick +5, beim Doppelklick -5:

Code: Alles auswählen

Case #LeftClick : var+5
Case #LeftDoubleClick : var-10
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Re: LeftDoubleClick bei TextGadget

Beitrag von edel »

Wenn du #SS_NOTIFY setzt werden bestimmte Events an das Fenster darueber geschickt.

Kann man dann so auslesen :

Code: Alles auswählen

Macro _LOWORD(a) 		: (a & $FFFF)       : EndMacro
Macro _HIWORD(a) 		: (a >> 16 & $FFFF) : EndMacro 

Procedure CB(h,m,w,l)
  
  If m = #WM_COMMAND
    
    If l ;message kommt von einem "Fenster"
      
      If _HIWORD(w) = #STN_DBLCLK
        
        Debug _LOWORD(w)
        
      EndIf      
      
    EndIf
    
    
  EndIf
  
  
  
  ProcedureReturn #PB_ProcessPureBasicEvents
EndProcedure


OpenWindow(1,0,0,200,400,"Test")

SetWindowCallback(@cb(),1)

TextGadget(555, 10, 10, 180, 180,"TextGadget 1 - ohne #SS_NOTIFY",#PB_Text_Center|#PB_Text_Border|#SS_NOTIFY)


Repeat
  Event=WaitWindowEvent()
Until Event = #PB_Event_CloseWindow
Setzt du kein SS_NOTIFY wird normal ein #WM_LBUTTONDBLCLK an das (Text)Fenster geschickt.
Allerdings ist das in der PB Eventschleife nicht wirklich brauchbar.

Code: Alles auswählen

OpenWindow(1,0,0,200,400,"Test")


TextGadget(555, 10, 10, 180, 180,"TextGadget 1 - ohne #SS_NOTIFY",#PB_Text_Center|#PB_Text_Border)


Repeat
  Event=WaitWindowEvent()
  EventGadget=EventGadget()

  If event = #WM_LBUTTONDBLCLK
    Debug "doppel klick"
  EndIf    
  
Until Event = #PB_Event_CloseWindow
Lord
Beiträge: 324
Registriert: 21.01.2008 19:11

Re: LeftDoubleClick bei TextGadget

Beitrag von Lord »

@TomS
Bei Deinem Icon-Beispiel magst du Recht haben, dort ist die
Wirkung eventuell sogar gewünscht, daß bei einem Doppel-
klick die Einzelklickaktion (= markieren des Icons) ebenfalls
(vorher) ausgeführt wird.
Sollen allerdings zwei sehr unterschiedliche Aktionen durch
die Klicks ausgelöst werden, stört eine durch den Einzel-
klick ausgelöste Aktion die Doppelklickaktion.

In Deinem zweiten Beispiel werden bei einem Doppelklick auch
immer beide Events verarbeitet. Führe ich einen Doppelklick
aus, wird var sowohl um 1 als auch um 9 erhöht (bzw +5-10).


@edel
Wenn ich das richtig sehe, verlagere ich bei Deiner Callback-
Variante das Problem von der Eventschleife in den Callback.
Auch dort kann ich das vor dem Doppelklick-Event erzeugte
und verschickte Singleklick-Event nicht verhindern, weil es
ja vor dem Doppelklick-Event den Callback bereits passiert
hat.
Bild
Benutzeravatar
NicknameFJ
Beiträge: 324
Registriert: 03.06.2007 14:36
Wohnort: Von der Sonne aus gesehen der dritte Planet

Re: LeftDoubleClick bei TextGadget

Beitrag von NicknameFJ »

Lord hat geschrieben: Sollen allerdings zwei sehr unterschiedliche Aktionen durch
die Klicks ausgelöst werden, stört eine durch den Einzel-
klick ausgelöste Aktion die Doppelklickaktion.
Entgegengesetzte Aktionen sollten allerdings auch vermieden werden.

Auf diese Problematik ist auch schon im Petzold (5. Auflage Seite 273) eingegangen.

Zitat hieraus:
Petzold hat geschrieben: Doppelklicks solltengrundsätzlich die Erweiterung einer Operation darstellen, die mit dem entsprechenden Objekt auf einen Klick hin ausgeführt wird. Auf diese Weise tut sich nicht nur das Programm leichter, sondern auch sein Benutzer. Der Explorer ist ein gutes Beispiel für einen solchen Mechanismus: Dort entspricht ein erster Klick auf dem Symbol einer Datei einer Auswahl; bei einem Doppelklick führt der erste Klick dieselbe Operation durch, der zweite startet das soeben ausgewählte Program bzw. öffnet das ausgewählte Dokument. Diese Logik ist nicht nur für den Benutzer einsichtig, sonder wie gesagt auch für das Programm, das auf die NAchricht WM_BUTTONDOWN grundsätzlich mit einer Auswahl, auf die Nachricht WM_LBUTTONDBLCLK grundsätzlich mit dem Start des zuvor ausgewählten Objekts reagieren kann. (Stellen Sie sich dagegen einmal die Verwicklungen in einem Programm vor, das über Einfach- und Doppelklicks zwischen entgegengesetzen Aktionen unterscheidet - wie beispielsweise dem Öffnen und Löschen einer Datei!)
Grüße

NicknameFJ
PS: Alle im Text enthaltenen Schreibfehler sind beabsichtigt und dienen der Belustigung aller

Bild
Benutzeravatar
TomS
Beiträge: 1508
Registriert: 23.12.2005 12:41
Wohnort: München

Re: LeftDoubleClick bei TextGadget

Beitrag von TomS »

So. Jetzt habe ich die dir die Problematik mit entgegengesetzten Aktionen erklärt und NicknameFJ hat auch noch mal was dazu gepostet.
Es gibt nur 2 Möglichkeiten: Entweder du stellst dein UI-Konzept um, oder liest das maximale Doppelklick-Interval aus und führst die EinzelKlick-Aktion erst aus, wenn diese Zeit vorbei ist.
Anders geht's nicht.
Antworten