Ich habe die Auswahl mehrerer Einträge (= MultiSelect) schon einmal für ein ExplorerTreeGadget benötigt, bei der ein Anwender mehrere Einträge anklicken (und auch wieder durch einen zweiten Klick abwählen kann), ohne dabei wie sonst in Windows üblich die Strg-Taste gedrückt halten zu müssen. Im Windows-API ist so etwas für TreeView-Gadgets eigentlich nicht vorgesehen. Man muß daher etwas tricksen. Die markierten Einträge werden dazu in einer LinkedList festgehalten. Ich habe den Code einmal für das TreeGadget umgeschrieben. Der Code zum Auslesen eines übergeordneten Node-Namens ist übrigens einem Beispiel von edel entnommen (
http://www.purebasic.fr/german/viewtopi ... 51&start=2). Danke dafür
Code: Alles auswählen
EnableExplicit
#Button = 0
#Tree = 1
#Window = 0
Procedure.L HighlightItem(HighlightFlag.B)
Protected ItemHandle.L
Protected TVHitTest.TV_HITTESTINFO
Protected TVItem.TV_ITEM
TVHitTest\Pt\x = WindowMouseX(#Window) - GadgetX(#Tree)
TVHitTest\Pt\y = WindowMouseY(#Window) - GadgetY(#Tree)
ItemHandle = SendMessage_(GadgetID(#Tree), #TVM_HITTEST, 0, @TVHitTest)
If ItemHandle <> 0
If TVHitTest\Flags <> #TVHT_ONITEMBUTTON
TVItem\Mask = #TVIF_STATE
TVItem\hItem = ItemHandle
If HighlightFlag = #True
TVItem\StateMask = #TVIS_DROPHILITED
TVItem\State = #TVIS_DROPHILITED
Else
TVItem\StateMask = #TVIS_DROPHILITED | #TVIS_SELECTED
TVItem\State = 0
EndIf
SendMessage_(GadgetID(#Tree), #TVM_SETITEM, 0, @TVItem)
RedrawWindow_(GadgetID(#Tree), 0, 0, #RDW_UPDATENOW)
ProcedureReturn #True
EndIf
EndIf
ProcedureReturn #False
EndProcedure
Procedure.S GetMajorNodeName()
Protected CurrentItem.L
Protected ItemHandle.L
Protected NodeName.S
Protected SubLevel.L
Protected TreeHandle.L
Protected TreeViewStructure.TV_ITEM
CurrentItem = GetGadgetState(#Tree)
SubLevel = GetGadgetItemAttribute(#Tree, CurrentItem, #PB_Tree_SubLevel)
TreeHandle = GadgetID(#Tree)
If SubLevel > 0
ItemHandle = SendMessage_(TreeHandle, #TVM_GETNEXTITEM, #TVGN_PARENT, GadgetItemID(#Tree, CurrentItem))
NodeName.S = Space(20)
TreeViewStructure\pszText = @NodeName
TreeViewStructure\Mask = #TVIF_TEXT | #TVIF_HANDLE
TreeViewStructure\hItem = ItemHandle
TreeViewStructure\cchTextMax = Len(NodeName)
SendMessage_(TreeHandle, #TVM_GETITEM, 0, @TreeViewStructure)
NodeName + " / "
EndIf
ProcedureReturn NodeName
EndProcedure
Define EntryFound.L
Define i.L
Define Msg.S
Define WindowEvent.L
NewList MarkedItem.S()
If OpenWindow(#Window, 0, 0, 170, 265, "MultiSelect-Demo", #PB_Window_SystemMenu | #PB_Window_TitleBar | #PB_Window_ScreenCentered)
If CreateGadgetList(WindowID(#Window))
TreeGadget(#Tree, 9, 12, 150, 210)
ButtonGadget(#Button, 10, 235, 150, 20, "Markierte Einträge anzeigen")
For i = 1 To 3
AddGadgetItem(#Tree, -1, "Node " + Str(i))
AddGadgetItem(#Tree, -1, "Subnode 1", 0, 1)
AddGadgetItem(#Tree, -1, "Subnode 2", 0, 1)
AddGadgetItem(#Tree, -1, "Subnode 3", 0, 1)
SetGadgetItemState(#Tree, (i - 1) * 4, #PB_Tree_Expanded)
Next i
Repeat
WindowEvent = WaitWindowEvent()
If EventType() = #PB_EventType_LeftClick
If EventGadget() = #Button
Break
EndIf
If GetGadgetState(#Tree) <> -1
EntryFound = #False
If CountList(MarkedItem()) = 0
If HighlightItem(#True) = #True
AddElement(MarkedItem())
MarkedItem() = GetMajorNodeName() + GetGadgetText(#Tree)
EndIf
Else
ForEach MarkedItem()
If MarkedItem() = GetMajorNodeName() + GetGadgetText(#Tree)
If HighlightItem(#False) = #True
DeleteElement(MarkedItem())
EntryFound = #True
EndIf
Break
EndIf
Next
If EntryFound = #False
If HighlightItem(#True) = #True
AddElement(MarkedItem())
MarkedItem() = GetMajorNodeName() + GetGadgetText(#Tree)
EndIf
EndIf
EndIf
EndIf
EndIf
Until WindowEvent = #PB_Event_CloseWindow
If CountList(MarkedItem()) > 0
Msg = "Anzahl ausgewählter Einträge: " + Str(CountList(MarkedItem())) + #CR$ + #CR$
ForEach MarkedItem()
Msg = Msg + MarkedItem() + #CR$
Next
MessageRequester("Info", Msg)
Else
MessageRequester("Info", "Es wurden keine Einträge markiert!")
EndIf
EndIf
EndIf