bei API-Geschichten habe ich dank google oft nach ein paar Minuten schon die Lösung.
Manchmal suche ich mir aber einen Wolf. So einen Fall habe ich nun.
>> Ich möchte in dem TreeGadget die Zeilen abwechselnd hell/dunkel einfärben.
Mit SetGadgetItemColor geht das ja auch prima.
Wenn ein Knoten mit ungerader Anzahl an Subitems geöffnet oder geschlossen wird stimmt der Farbwechsel aber nicht mehr.
Außerdem ist es nicht notwendig die nicht sichtbaren Subitems einzufärben.
Auch die Items oberhalb des öffnenden oder schließenden Knoten brauchen nicht geändert werden.
Ich denke mit #TVM_GETNEXTITEM in der While-Schleife bin ich da auf einem guten Weg.
>> Nun brauche ich aber ein API-Gegenstück zu SetGadgetItemColor, weil ich mit dem OS-Handel arbeiten muß.
Auch wenn ich glaube, dass dazu kein Code notwendig wäre, habe ich, um auch alle glücklich zu machen, ein Dummy (sogar mit EnableExplicit) vorbereitet.

Code: Alles auswählen
EnableExplicit
#TVM_SETBKCOLOR = 4381
Enumeration ; Gadgets
#TV01
EndEnumeration
Global TreeGadget_brightBackColor.i = $FFFFEE
Global TreeGadget_darkBackColor.i = $EEEECC
Define hwndTV, dwStyle
Define DefaultTreeCallback.I
Procedure TreeGadget_BackColor( Gadget, Item )
Protected hItem.l, hwndTV.i
hwndTV = GadgetID(Gadget)
Debug Item
hItem.l = GadgetItemID(Gadget, Item)
Debug hItem
hItem = SendMessage_(hwndTV, #TVM_GETNEXTITEM, #TVGN_NEXTVISIBLE , hItem)
While hItem ; der Farbwechsel kommt später - sobald es überhaupt läuft
Debug hItem
;SetGadgetItemColor(Gadget, Item+1, #PB_Gadget_BackColor, TreeGadget_darkBackColor)
hItem = SendMessage_(hwndTV, #TVM_GETNEXTITEM, #TVGN_NEXTVISIBLE , hItem)
Wend
EndProcedure
Procedure CustomTreeGadgetCallback(WindowHandle.I, Msg.I, WParam.L, LParam.L) ; eine Proc für alle TreeGadgets - individuelles an anderer Stelle
Shared DefaultTreeCallback.I
Protected HitTest.TV_HITTESTINFO
Protected TVItem.TV_ITEM
If Msg = #WM_LBUTTONDOWN ; Markierung auf geklicktes Item setzen
HitTest\pt\x = LParam & $FFFF
HitTest\pt\y = (LParam >> 16) & $FFFF
If SendMessage_(WindowHandle, #TVM_HITTEST, 0, HitTest)
If HitTest\flags = #TVHT_ONITEMSTATEICON
TVItem\mask = #TVIF_PARAM
TVItem\hItem = HitTest\hItem
SendMessage_(WindowHandle, #TVM_GETITEM, 0, TVItem)
SetGadgetState(0, TVItem\lParam)
EndIf
EndIf
EndIf
ProcedureReturn CallWindowProc_(DefaultTreeCallback, WindowHandle, Msg, WParam, LParam)
EndProcedure
Procedure PrepareTreeGadget(Gadget)
AddGadgetItem(Gadget,-1,"Testitem 0",0,0)
AddGadgetItem(Gadget,-1,"Subitem",0,1)
AddGadgetItem(Gadget,-1,"Testitem 1",0,0)
AddGadgetItem(Gadget,-1,"Subitem",0,1)
AddGadgetItem(Gadget,-1,"Subitem",0,1)
AddGadgetItem(Gadget,-1,"Subitem",0,1)
AddGadgetItem(Gadget,-1,"Testitem 2",0,0)
EndProcedure
If OpenWindow(0,0,0,500,250,"Window",#PB_Window_SystemMenu|#PB_Window_ScreenCentered)
TreeGadget(#TV01,10,10,480,230,#PB_Tree_NoLines)
DefaultTreeCallback = SetWindowLongPtr_(GadgetID(#TV01), #GWL_WNDPROC, @CustomTreeGadgetCallback())
PrepareTreeGadget(#TV01)
hwndTV = GadgetID(#TV01)
SendMessage_(hwndTV,#TVM_SETBKCOLOR,0,RGB(255,255,192))
SetGadgetItemColor(#TV01, 1, #PB_Gadget_FrontColor, $FF0000, 1) ; sinnlos - nur zum Test
SetGadgetItemColor(#TV01, 2, #PB_Gadget_BackColor, $00FF00, -1)
SetGadgetItemColor(#TV01, 3, #PB_Gadget_BackColor, $0000FF, 1)
SetGadgetItemColor(#TV01, 0, #PB_Gadget_BackColor, TreeGadget_darkBackColor)
TreeGadget_BackColor( #TV01, 0 ) ; soll alle nachfolgenden Items abwechseld hell/dunkel färben
dwStyle = GetWindowLongPtr_(hwndTV,#GWL_STYLE);
dwStyle = dwStyle|#TVS_FULLROWSELECT
SetWindowLongPtr_(hwndTV,#GWL_STYLE, dwStyle)
Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
EndIf