Seite 2 von 2

Re: Auf-/Zuklappen bei Doppelklick bei Treegadget abschalten

Verfasst: 30.09.2015 13:04
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.

Re: Auf-/Zuklappen bei Doppelklick bei Treegadget abschalten

Verfasst: 30.09.2015 13:12
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

Re: Auf-/Zuklappen bei Doppelklick bei Treegadget abschalten

Verfasst: 30.09.2015 14:14
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

Re: Auf-/Zuklappen bei Doppelklick bei Treegadget abschalten

Verfasst: 30.09.2015 14:19
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.

Re: Auf-/Zuklappen bei Doppelklick bei Treegadget abschalten

Verfasst: 30.09.2015 14:20
von RSBasic
Komisch, bei mir klappt nichts aus, wenn ich ein Doppelklick mache.
Welche Windows-Version verwendest du?

Re: Auf-/Zuklappen bei Doppelklick bei Treegadget abschalten

Verfasst: 30.09.2015 14:35
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: