Auf-/Zuklappen bei Doppelklick bei Treegadget abschalten

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8820
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Re: Auf-/Zuklappen bei Doppelklick bei Treegadget abschalten

Beitrag von NicTheQuick »

Ich hab's jetzt so umgeschrieben. Da geht es jetzt zu Testzwecken nur mit TreeGadget 0.

Code: Alles auswählen

EnableExplicit

Procedure WinCallback(hWnd, uMsg, WParam, LParam)
	; Windows fills the parameter automatically, which we will use in the callback...
	If umsg = #WM_NOTIFY
		Protected *msg.nmhdr ; Solange nicht gesichert ist, welche Nachricht es ist, darf man nur auf \code zugreifen!
		*msg = LParam
		If *msg\code = #NM_DBLCLK
			If *msg\hwndFrom = GadgetID(0)
				;Debug "Doubleclick on Treegadget at position " + Str(GetGadgetState(0))
				PostEvent(#PB_Event_Gadget, 0, 0, #PB_EventType_LeftDoubleClick)
				ProcedureReturn 1
			EndIf
		EndIf
	EndIf
	
	ProcedureReturn #PB_ProcessPureBasicEvents
EndProcedure

Define id, a


If OpenWindow(0, 0, 0, 355, 180, "TreeGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
	TreeGadget(0, 10, 10, 160, 160)                                         ; TreeGadget standard
	TreeGadget(1, 180, 10, 160, 160, #PB_Tree_CheckBoxes | #PB_Tree_NoLines); TreeGadget with Checkboxes + NoLines
	
	SetWindowCallback(@WinCallback())
	For ID = 0 To 1
		For a = 0 To 10
			AddGadgetItem (ID, -1, "Normal Item "+Str(a), 0, 0) ; if you want to add an image, use
			AddGadgetItem (ID, -1, "Node "+Str(a), 0, 0)		; ImageID(x) as 4th parameter
			AddGadgetItem(ID, -1, "Sub-Item 1", 0, 1)			; These are on the 1st sublevel
			AddGadgetItem(ID, -1, "Sub-Item 2", 0, 1)
			AddGadgetItem(ID, -1, "Sub-Item 3", 0, 1)
			AddGadgetItem(ID, -1, "Sub-Item 4", 0, 1)
			AddGadgetItem (ID, -1, "File "+Str(a), 0, 0) ; sublevel 0 again
		Next
	Next
	Repeat
		Select WaitWindowEvent()
			Case #PB_Event_CloseWindow
				Break
			Case #PB_Event_Gadget
				If EventType() = #PB_EventType_LeftDoubleClick
					Debug "Double Rainbow all the way!"
				EndIf
		EndSelect
	ForEver
EndIf
Kann man den WindowCallback nicht auch nur auf ein einzelnen Gadget anwenden, sodass man sicher sein kann, dass der empfangene Doppelklick nur für das TreeGadget gilt.
Hintergrund ist, dass ich ein Modul geschrieben habe, dass ein TreeGadget erstellt und komplett selbst verwaltet. Dieses Modul soll auf genau dieses Gadget dann unabhängig von alle anderen Gadgets einen Callback besitzen, der das Doppelklick-Problem löst. Das heißt bei anderen manuell erstellten TreeGadgets soll der Callback gar nicht erst ausgelöst werden.
Benutzeravatar
RSBasic
Admin
Beiträge: 8047
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: Auf-/Zuklappen bei Doppelklick bei Treegadget abschalten

Beitrag von RSBasic »

Meinst du so, falls ich dich richtig verstanden habe:

Code: Alles auswählen

EnableExplicit

Global TreeProc

Procedure TreeProc(hWnd, uMsg, wParam, lParam)
  If umsg = #WM_LBUTTONDBLCLK
    ;Debug "Doubleclick on Treegadget at position " + Str(GetGadgetState(0))
    PostEvent(#PB_Event_Gadget, GetProp_(GetAncestor_(hWnd, #GA_ROOT), "PB_WINDOWID")-1, GetProp_(hWnd, "PB_ID"), #PB_EventType_LeftDoubleClick)
    ProcedureReturn 1
  EndIf
  
  ProcedureReturn CallWindowProc_(TreeProc, hWnd, uMsg, wParam, lParam)
EndProcedure

Define id, a

If OpenWindow(0, 0, 0, 355, 180, "TreeGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  TreeGadget(0, 10, 10, 160, 160)                                         ; TreeGadget standard
  TreeGadget(1, 180, 10, 160, 160, #PB_Tree_CheckBoxes | #PB_Tree_NoLines); TreeGadget with Checkboxes + NoLines
  
  TreeProc = SetWindowLongPtr_(GadgetID(0), #GWL_WNDPROC, @TreeProc())
  
  For ID = 0 To 1
    For a = 0 To 10
      AddGadgetItem (ID, -1, "Normal Item "+Str(a), 0, 0) ; if you want to add an image, use
      AddGadgetItem (ID, -1, "Node "+Str(a), 0, 0)        ; ImageID(x) as 4th parameter
      AddGadgetItem(ID, -1, "Sub-Item 1", 0, 1)           ; These are on the 1st sublevel
      AddGadgetItem(ID, -1, "Sub-Item 2", 0, 1)
      AddGadgetItem(ID, -1, "Sub-Item 3", 0, 1)
      AddGadgetItem(ID, -1, "Sub-Item 4", 0, 1)
      AddGadgetItem (ID, -1, "File "+Str(a), 0, 0) ; sublevel 0 again
    Next
  Next
  
  Repeat
    Select WaitWindowEvent()
      Case #PB_Event_CloseWindow
        Break
      Case #PB_Event_Gadget
        If EventType() = #PB_EventType_LeftDoubleClick
          Debug "Double Rainbow all the way!"
        EndIf
    EndSelect
  ForEver
EndIf
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8820
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Re: Auf-/Zuklappen bei Doppelklick bei Treegadget abschalten

Beitrag von NicTheQuick »

Fast richtig. <)

Bloß klappen die Einträge jetzt doch wieder auf, wenn man einen Doppelklick auf sie macht. Ich fürchte jetzt kommen wir zu dem Problem, was überall auch im Netz zu finden ist. Das EXPAND-/ COLLAPSE-Event kommt quasi vor dem DBLCLK-Event und kann somit nicht abgefangen werden. Fängt man allerdings das EXPAND-/ COLLAPSE-Event ab, kann man gar nichts mehr auf- und zuklappen.

Im Netz findet man unter anderem die Idee, zu checken, ob ein Doppelklick vorliegt, indem man die DoubleClickTime mit einbezieht. Dann kann man selbst schon vor dem DBLCLK-Event feststellen, ob einer gemacht wurde und dann auch EXPAND und COLLAPSE ignorieren. Dann funktioniert es nur nicht mehr, wenn man schnell nacheinander mehrere Einträge aufklappen will, weil man dann oft innerhalb der DoubleClickTime liegt, obwohl man auf verschiedene Einträge geklickt hat. dann öffnet man quasi nur jeden zweiten. Daraufhin findet man Lösungen, die einen Threshold nutzen und einen Doppelklick nur als solchen erkennen, wenn die Koordinaten des ersten und zweiten Klicks eng beieinander liegen. Oder man schaut, ob der Klick rechts vom +/- Zeichen war oder nicht.

Siehe auch: Wie man sieht, ist das ein viel gefragtes Thema und leider gibt es da von Windows nichts eigenes. Ein Flag um Expand/Collapse bei Doppelklick zu (de)aktivieren wäre schon nett, oder? :D
GPI
Beiträge: 1511
Registriert: 29.08.2004 13:18
Kontaktdaten:

Re: Auf-/Zuklappen bei Doppelklick bei Treegadget abschalten

Beitrag von GPI »

Warum nicht in "globalen" Callback überprüfen, ob das ding für das gewünschte Gadget ist? Siehe mein Beispielcode:
*msg\hwndFrom <- das ist die Gadgetid.
CodeArchiv Rebirth: Deutsches Forum Github Hilfe ist immer gern gesehen!
Benutzeravatar
RSBasic
Admin
Beiträge: 8047
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: Auf-/Zuklappen bei Doppelklick bei Treegadget abschalten

Beitrag von RSBasic »

Komisch, bei mir klappt nichts aus, wenn ich ein Doppelklick mache.
Welche Windows-Version verwendest du?
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8820
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Re: Auf-/Zuklappen bei Doppelklick bei Treegadget abschalten

Beitrag von NicTheQuick »

RSBasic hat geschrieben:Komisch, bei mir klappt nichts aus, wenn ich ein Doppelklick mache.
Welche Windows-Version verwendest du?
Shit, du hast Recht. Ich hab zu schnell getestet. Das Gadget mit ID 0 klappt nicht auf, das mit ID 1 natürlich schon. Da ist ja auch kein Callback drin.

Also vergessen wir mal einfach meinen letzten Beitrag. :wink:
Antworten