Code: Alles auswählen
Structure _TREE_DATA_
*TreeCB
GadgetID.i
BackColor.i
FrontColor.i
Focused.b
Item.i
EndStructure
Procedure TreeCallBack(hWnd, Message, wParam, lParam)
Protected *TD._TREE_DATA_, Item, Result
*TD = GetProp_(hwnd, "TREE_FOCUS")
If *TD
Select Message
Case #WM_SETFOCUS
*TD\Focused = #True
Item = GetGadgetState(*TD\GadgetID)
SetGadgetItemColor(*TD\GadgetID, Item, #PB_Gadget_BackColor, -1)
SetGadgetItemColor(*TD\GadgetID, Item, #PB_Gadget_FrontColor, -1)
Case #WM_KILLFOCUS
*TD\Focused = #False
Item = GetGadgetState(*TD\GadgetID)
If Item > -1
SetGadgetItemColor(*TD\GadgetID, Item, #PB_Gadget_BackColor, *TD\BackColor)
SetGadgetItemColor(*TD\GadgetID, Item, #PB_Gadget_FrontColor, *TD\FrontColor)
*TD\Item = Item
EndIf
Case #WM_DESTROY
Case #WM_NCDESTROY
Item = *TD\TreeCB
FreeMemory(*TD)
RemoveProp_(hwnd, "TREE_FOCUS")
Result = CallWindowProc_(Item, hWnd, Message, wParam, lParam)
ProcedureReturn Result
Case #WM_PAINT
Item = GetGadgetState(*TD\GadgetID)
If Item <> *TD\Item And *TD\Item <> -1
SetGadgetItemColor(*TD\GadgetID, *TD\Item, #PB_Gadget_BackColor, -1)
SetGadgetItemColor(*TD\GadgetID, *TD\Item, #PB_Gadget_FrontColor, -1)
If *TD\Focused = #False And Item > -1
*TD\Item = Item
SetGadgetItemColor(*TD\GadgetID, Item, #PB_Gadget_BackColor, *TD\BackColor)
SetGadgetItemColor(*TD\GadgetID, Item, #PB_Gadget_FrontColor, *TD\FrontColor)
Else
*TD\Item = -1
EndIf
EndIf
EndSelect
Result = CallWindowProc_(*TD\TreeCB, hWnd, Message, wParam, lParam)
EndIf
ProcedureReturn Result
EndProcedure
Procedure DarkenColor(Color, Amount)
Protected R, G, B
R = (Color & $FF) - Amount
G = ((Color & $FF00) >> 8) - Amount
B = ((Color & $FF0000) >> 16) - Amount
If R < 0 : R = 0 : EndIf
If G < 0 : G = 0 : EndIf
If B < 0 : B = 0 : EndIf
Color = R | (G << 8) | (B << 16)
ProcedureReturn Color
EndProcedure
Procedure TreeAddLostFocusColor(Gadget, BackColor.i = #PB_Default, FrontColor.i = #PB_Default)
Protected *TD._TREE_DATA_
If BackColor = #PB_Default
BackColor = DarkenColor(GetSysColor_(#COLOR_HIGHLIGHT), 15)
EndIf
If FrontColor = #PB_Default
FrontColor = DarkenColor(GetSysColor_(#COLOR_HIGHLIGHTTEXT), 15)
EndIf
*TD = AllocateMemory(SizeOf(_TREE_DATA_))
*TD\GadgetID = Gadget
*TD\BackColor = BackColor
*TD\FrontColor = FrontColor
*TD\Item = -1
*TD\TreeCB = SetWindowLongPtr_(GadgetID(Gadget), #GWL_WNDPROC, @TreeCallBack())
SetProp_(GadgetID(Gadget), "TREE_FOCUS", *TD)
EndProcedure
Procedure InitTree(Gadget)
;Use this, to initialy set the colors correctly, especially when changing the state of the tree at the beginning
Protected *TD._TREE_DATA_, Item
*TD = GetProp_(GadgetID(Gadget), "TREE_FOCUS")
If *TD
Item = GetGadgetState(Gadget)
If Item > -1
Select *TD\Focused
Case #True
SetGadgetItemColor(Gadget, Item, #PB_Gadget_BackColor, -1)
SetGadgetItemColor(Gadget, Item, #PB_Gadget_FrontColor, -1)
Case #False
SetGadgetItemColor(Gadget, Item, #PB_Gadget_BackColor, *TD\BackColor)
SetGadgetItemColor(Gadget, Item, #PB_Gadget_FrontColor, *TD\FrontColor)
*TD\Item = Item
EndSelect
EndIf
EndIf
EndProcedure
CompilerIf #PB_Compiler_IsMainFile
Define BackColor.i, FrontColor.i
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)
TreeAddLostFocusColor(0)
StringGadget(1, 180, 10, 160, 24, "")
ButtonGadget(2, 180, 40, 160, 24, "Unselect Tree")
ButtonGadget(3, 180, 70, 160, 24, "Select Item 4")
AddGadgetItem(0, -1, "Item 1")
AddGadgetItem(0, -1, "Item 2")
AddGadgetItem(0, -1, "Item 3")
AddGadgetItem(0, -1, "Item 4")
AddGadgetItem(0, -1, "Item 5")
SetGadgetState(0, 0)
SetActiveGadget(1)
InitTree(0)
Repeat
Select WaitWindowEvent()
Case #PB_Event_CloseWindow
Break
Case #PB_Event_Gadget
Select EventGadget()
Case 2
SetGadgetState(0, -1)
Case 3
SetGadgetState(0, 3)
EndSelect
EndSelect
ForEver
EndIf
CompilerEndIf