#PB_Tree_AlwaysShowSelection Auswahl verdeutlichen

Windowsspezifisches Forum , API ,..
Beiträge, die plattformübergreifend sind, gehören ins 'Allgemein'-Forum.
Benutzeravatar
HeX0R
Beiträge: 2954
Registriert: 10.09.2004 09:59
Computerausstattung: AMD Ryzen 7 5800X
96Gig Ram
NVIDIA GEFORCE RTX 3060TI/8Gig
Win10 64Bit
G19 Tastatur
2x 24" + 1x27" Monitore
Glorious O Wireless Maus
PB 3.x-PB 6.x
Oculus Quest 2
Kontaktdaten:

#PB_Tree_AlwaysShowSelection Auswahl verdeutlichen

Beitrag von HeX0R »

Weiss jemand, wie ich die ausgewählte Zeile im u.g. Beispiel mehr hervorheben kann, wenn der Tree den Focus verliert (also so wie nach dem Starten des Beispiels).
Das ärgert mich schon länger, man kann kaum erkennen (ist wohl aber auch Theme (und Augen) abhängig), welche Zeile noch aktiv ist.

Code: Alles auswählen

If OpenWindow(0, 0, 0, 355, 180, "TreeGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
	TreeGadget(0, 0, 10, 160, 160, #PB_Tree_NoButtons | #PB_Tree_NoLines | #PB_Tree_AlwaysShowSelection)
	StringGadget(1, 180, 10, 160, 24, "")
	AddGadgetItem(0, -1, "Bla")
	SetGadgetState(0, 0)
	SetActiveGadget(1)
	Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
EndIf
Benutzeravatar
RSBasic
Admin
Beiträge: 8022
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: #PB_Tree_AlwaysShowSelection Auswahl verdeutlichen

Beitrag von RSBasic »

Ohne API könntest du den aktuell ausgewählten Eintrag mit SetGadgetItemColor() einfärben.
Ansonsten gehts nur über Windows Callback.
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Benutzeravatar
HeX0R
Beiträge: 2954
Registriert: 10.09.2004 09:59
Computerausstattung: AMD Ryzen 7 5800X
96Gig Ram
NVIDIA GEFORCE RTX 3060TI/8Gig
Win10 64Bit
G19 Tastatur
2x 24" + 1x27" Monitore
Glorious O Wireless Maus
PB 3.x-PB 6.x
Oculus Quest 2
Kontaktdaten:

Re: #PB_Tree_AlwaysShowSelection Auswahl verdeutlichen

Beitrag von HeX0R »

Am liebsten wäre es mir eigentlich einfach die "seichte" Hintergrundfarbe, die Windows eh nutzt zu ändern.
Alles andere kann ich natürlich auch machen, ist mir aber aktuell zuviel Spraddel.
Benutzeravatar
Shardik
Beiträge: 738
Registriert: 25.01.2005 12:19

Re: #PB_Tree_AlwaysShowSelection Auswahl verdeutlichen

Beitrag von Shardik »

Der von RSBasic vorgeschlagene Weg mit SetGadgetItemColor() ist doch eigentlich nicht so aufwendig:

Code: Alles auswählen

EnableExplicit

#ItemBackColor = $DEC4B0
#Tree = 0

Procedure RefreshTreeItemSelection()
  Protected ActiveGadget.I = GetActiveGadget()
  Protected SelectedItem.I
  Static LastActiveGadget.I
  Static LastSelectedItem.I

  If LastActiveGadget <> ActiveGadget
    LastActiveGadget = ActiveGadget
    SelectedItem = GetGadgetState(#Tree)

    If ActiveGadget = #Tree
      SetGadgetItemColor(#Tree, LastSelectedItem, #PB_Gadget_BackColor, -1)
    Else
      SetGadgetItemColor(#Tree, SelectedItem, #PB_Gadget_BackColor,
        #ItemBackColor)
    EndIf

    LastSelectedItem = SelectedItem
  EndIf
EndProcedure

If OpenWindow(0, 0, 0, 355, 180, "TreeGadget", #PB_Window_SystemMenu |
  #PB_Window_ScreenCentered)
  TreeGadget(#Tree, 0, 10, 160, 160, #PB_Tree_NoButtons | #PB_Tree_NoLines)
  StringGadget(1, 180, 10, 160, 24, "")
  AddGadgetItem(0, -1, "Harry Rannit")
  AddGadgetItem(0, -1, "Ginger Brokeit")
  AddGadgetItem(0, -1, "Didi Findit")
  SetGadgetState(0, 0)
  SetActiveGadget(1)
  RefreshTreeItemSelection()

  Repeat
    Select WaitWindowEvent()
      Case #PB_Event_CloseWindow
        Break
      Case #PB_Event_Gadget
        RefreshTreeItemSelection()
    EndSelect
  ForEver
EndIf
Benutzeravatar
HeX0R
Beiträge: 2954
Registriert: 10.09.2004 09:59
Computerausstattung: AMD Ryzen 7 5800X
96Gig Ram
NVIDIA GEFORCE RTX 3060TI/8Gig
Win10 64Bit
G19 Tastatur
2x 24" + 1x27" Monitore
Glorious O Wireless Maus
PB 3.x-PB 6.x
Oculus Quest 2
Kontaktdaten:

Re: #PB_Tree_AlwaysShowSelection Auswahl verdeutlichen

Beitrag von HeX0R »

Shardik hat geschrieben:Der von RSBasic vorgeschlagene Weg mit SetGadgetItemColor() ist doch eigentlich nicht so aufwendig
Natürlich ist das in diesem Kinkerlitzchen-Beispiel nicht aufwendig, ich habe aber zwei Probleme im echten Code:
1.) Es geht nicht nur um einen Tree
2.) Das TreeGadget unterstützt kein Focus/LostFocus

Aber egal, ich lasse mir was einfallen.
Benutzeravatar
RSBasic
Admin
Beiträge: 8022
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: #PB_Tree_AlwaysShowSelection Auswahl verdeutlichen

Beitrag von RSBasic »

Hi HeX0R
HeX0R hat geschrieben:2.) Das TreeGadget unterstützt kein Focus/LostFocus
Ich hoffe, WinAPI ist okay?

Code: Alles auswählen


Global TreeCB

Procedure TreeCB(hWnd, Message, wParam, lParam)
  Select Message
    Case #WM_SETFOCUS
      Debug "Fokus bekommen"
    Case #WM_KILLFOCUS
      Debug "Fokus verloren"
  EndSelect
  
  ProcedureReturn CallWindowProc_(TreeCB, hWnd, Message, wParam, lParam)
EndProcedure

If OpenWindow(0, 0, 0, 355, 180, "TreeGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
   TreeGadget(0, 0, 10, 160, 160, #PB_Tree_NoButtons | #PB_Tree_NoLines | #PB_Tree_AlwaysShowSelection)
   StringGadget(1, 180, 10, 160, 24, "")
   AddGadgetItem(0, -1, "Bla")
   SetGadgetState(0, 0)
   SetActiveGadget(1)
   
   TreeCB = SetWindowLongPtr_(GadgetID(0), #GWL_WNDPROC, @TreeCB())
   
   Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
EndIf
HeX0R hat geschrieben:1.) Es geht nicht nur um einen Tree
Wenn du das global und systemweit ändern möchtest, dann nur über SetSysColors_()
Ansonsten musst du für jeden Gadgettyp separat ändern.
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Benutzeravatar
HeX0R
Beiträge: 2954
Registriert: 10.09.2004 09:59
Computerausstattung: AMD Ryzen 7 5800X
96Gig Ram
NVIDIA GEFORCE RTX 3060TI/8Gig
Win10 64Bit
G19 Tastatur
2x 24" + 1x27" Monitore
Glorious O Wireless Maus
PB 3.x-PB 6.x
Oculus Quest 2
Kontaktdaten:

Re: #PB_Tree_AlwaysShowSelection Auswahl verdeutlichen

Beitrag von HeX0R »

O.k., Du bist mir zuvor gekommen, genau das wollte ich später mal testen.
Wobei ich es merkwürdig finde, dass das TreeGadget die beiden Events dann nicht auch aus PB heraus unterstützt.
Ich denke, ich mache das anders mit ein wenig Subclassing.
Danke!
Benutzeravatar
Shardik
Beiträge: 738
Registriert: 25.01.2005 12:19

Re: #PB_Tree_AlwaysShowSelection Auswahl verdeutlichen

Beitrag von Shardik »

Ich habe noch ein weiteres "Kinkerlitzchen"-Beispiel mit Windows API gefunden, das ich bereits 2012 im englischen Forum gezeigt habe:
http://www.purebasic.fr/english/viewtop ... 89&start=1

Brauchst Du ein Multiplattform-fähiges Beispiel, das auf ein nachgerüstetes GotFocus/LostFocus für das TreeGadget reagiert?
Benutzeravatar
HeX0R
Beiträge: 2954
Registriert: 10.09.2004 09:59
Computerausstattung: AMD Ryzen 7 5800X
96Gig Ram
NVIDIA GEFORCE RTX 3060TI/8Gig
Win10 64Bit
G19 Tastatur
2x 24" + 1x27" Monitore
Glorious O Wireless Maus
PB 3.x-PB 6.x
Oculus Quest 2
Kontaktdaten:

Re: #PB_Tree_AlwaysShowSelection Auswahl verdeutlichen

Beitrag von HeX0R »

AAHAA, Dich hat es auch schonmal gestört :mrgreen:

Das ist perfekt so, das werde ich so ähnlich bei mir einbauen, und Multiplatform brauche ich im aktuellen Fall nicht.

Merci!
Benutzeravatar
HeX0R
Beiträge: 2954
Registriert: 10.09.2004 09:59
Computerausstattung: AMD Ryzen 7 5800X
96Gig Ram
NVIDIA GEFORCE RTX 3060TI/8Gig
Win10 64Bit
G19 Tastatur
2x 24" + 1x27" Monitore
Glorious O Wireless Maus
PB 3.x-PB 6.x
Oculus Quest 2
Kontaktdaten:

Re: #PB_Tree_AlwaysShowSelection Auswahl verdeutlichen

Beitrag von HeX0R »

So, ich lass mir jetzt einfach die PB eigenen #PB_EventType_Focus/LostFocus schicken und alles is gut :mrgreen:

Code: Alles auswählen

Structure _TREE_DATA_
	*TreeCB
	GadgetID.i
	WindowID.i
EndStructure

Procedure TreeCallBack(hWnd, Message, wParam, lParam)
	Protected *TD._TREE_DATA_
	
	*TD = GetProp_(hwnd, "TREE_FOCUS")
	If *TD
		Select Message
			Case #WM_SETFOCUS
				PostEvent(#PB_Event_Gadget, *TD\WindowID, *TD\GadgetID, #PB_EventType_Focus)
			Case #WM_KILLFOCUS
				PostEvent(#PB_Event_Gadget, *TD\WindowID, *TD\GadgetID, #PB_EventType_LostFocus)
		EndSelect
		
		ProcedureReturn CallWindowProc_(*TD\TreeCB, hWnd, Message, wParam, lParam)
	EndIf
EndProcedure

Procedure EnableTreeFocus(WindowID, GadgetID)
	Protected *TreeCB, *TD._TREE_DATA_
	
	*TreeCB       = SetWindowLongPtr_(GadgetID(GadgetID), #GWL_WNDPROC, @TreeCallBack())
	*TD           = AllocateMemory(SizeOf(_TREE_DATA_))
	*TD\TreeCB    = *TreeCB
	*TD\GadgetID  = GadgetID
	*TD\WindowID  = WindowID
	SetProp_(GadgetID(GadgetID), "TREE_FOCUS", *TD)
	
EndProcedure




If OpenWindow(0, 0, 0, 355, 180, "TreeGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
	TreeGadget(0, 0, 10, 160, 160, #PB_Tree_NoButtons | #PB_Tree_NoLines | #PB_Tree_AlwaysShowSelection)
	StringGadget(1, 180, 10, 160, 24, "")
	EnableTreeFocus(0, 0)
	AddGadgetItem(0, -1, "Bla")
	SetGadgetState(0, 0)
	SetActiveGadget(1)
	Repeat
		Select WaitWindowEvent()
			Case #PB_Event_CloseWindow
				Break
			Case #PB_Event_Gadget
				Select EventGadget()
					Case 0
						Select EventType()
							Case #PB_EventType_Focus
								Debug "Focus"
							Case #PB_EventType_LostFocus
								Debug "LostFocus"
						EndSelect
				EndSelect
		EndSelect
	ForEver
EndIf
Antworten