Seite 1 von 2
#PB_Tree_AlwaysShowSelection Auswahl verdeutlichen
Verfasst: 30.07.2019 12:56
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
Re: #PB_Tree_AlwaysShowSelection Auswahl verdeutlichen
Verfasst: 30.07.2019 13:11
von RSBasic
Ohne API könntest du den aktuell ausgewählten Eintrag mit SetGadgetItemColor() einfärben.
Ansonsten gehts nur über Windows Callback.
Re: #PB_Tree_AlwaysShowSelection Auswahl verdeutlichen
Verfasst: 30.07.2019 13:17
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.
Re: #PB_Tree_AlwaysShowSelection Auswahl verdeutlichen
Verfasst: 30.07.2019 15:46
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
Re: #PB_Tree_AlwaysShowSelection Auswahl verdeutlichen
Verfasst: 31.07.2019 15:10
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.
Re: #PB_Tree_AlwaysShowSelection Auswahl verdeutlichen
Verfasst: 31.07.2019 15:20
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.
Re: #PB_Tree_AlwaysShowSelection Auswahl verdeutlichen
Verfasst: 31.07.2019 15:47
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!
Re: #PB_Tree_AlwaysShowSelection Auswahl verdeutlichen
Verfasst: 31.07.2019 15:56
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?
Re: #PB_Tree_AlwaysShowSelection Auswahl verdeutlichen
Verfasst: 31.07.2019 16:01
von HeX0R
AAHAA, Dich hat es auch schonmal gestört
Das ist perfekt so, das werde ich so ähnlich bei mir einbauen, und Multiplatform brauche ich im aktuellen Fall nicht.
Merci!
Re: #PB_Tree_AlwaysShowSelection Auswahl verdeutlichen
Verfasst: 31.07.2019 16:33
von HeX0R
So, ich lass mir jetzt einfach die PB eigenen #PB_EventType_Focus/LostFocus schicken und alles is gut
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