J'ai ce magnifique code qui date de 2006. Ce qui est sélectionné apparaît à droite de l'écran.
Code : Tout sélectionner
; English forum: http://www.purebasic.fr/english/viewtopic.php?p=158360
; Author: sverson
; Date: 21. August 2006
; OS: Windows
; Demo: Yes
; Use ExplorerListGadget Checkboxes to select directories
; and display the result in a ListIconGadget
; Thanks to srod, breeze4me AND freak!
; See also remi_meier's "Simple Wrapper For TreeGadget-Macros by MSDN"
; http://www.purebasic.fr/english/viewtopic.php?p=104420
Global MainWindowEvent.l
Global ExplorerTreeNo.l, ExplorerTreeID.l, ListIconNo.l, ListIconID.l, SplitterNo.l, SplitterID.l
Global oldwproc.l, oldwproc1.l
#TVM_GETITEMSTATE = #TV_FIRST + 39
#TVS_CHECKBOXES = $100
#LVM_GETHEADER = (#LVM_FIRST + 31)
Procedure IsInList(GadgetNo.l,String.s)
Protected GadgetItem.l, GadgetItems.l
GadgetItems = CountGadgetItems(GadgetNo) - 1
For GadgetItem = 0 To GadgetItems
If String = GetGadgetItemText(GadgetNo,GadgetItem,4)
ProcedureReturn GadgetItem
EndIf
Next
ProcedureReturn -1
EndProcedure
Procedure TreeViewSetCheckBox(tvGadgetNo.l)
Protected tvGadgetID.l, tvGadgetStyles.l
tvGadgetID = GadgetID(tvGadgetNo)
tvGadgetStyles = GetWindowLong_(tvGadgetID,#GWL_STYLE) | #TVS_CHECKBOXES
SetWindowLong_(tvGadgetID,#GWL_STYLE,tvGadgetStyles)
EndProcedure
Procedure.l GetItemNumber(GadgetID.l, hItem.l) ;/ THX freak CodeArchiv (modified)
Protected hItem1.l, hItem2.l, ItemNum.l
hItem1 = SendMessage_(GadgetID, #TVM_GETNEXTITEM, #TVGN_ROOT, 0)
While hItem1 <> hItem
hItem2 = SendMessage_(GadgetID, #TVM_GETNEXTITEM, #TVGN_CHILD, hItem1)
Repeat
If hItem2 = #Null: hItem2 = SendMessage_(GadgetID, #TVM_GETNEXTITEM, #TVGN_NEXT, hItem1): EndIf
If hItem2 = #Null: hItem1 = SendMessage_(GadgetID, #TVM_GETNEXTITEM, #TVGN_PARENT, hItem1): EndIf
Until hItem2 <> #Null
hItem1 = hItem2
ItemNum + 1
Wend
ProcedureReturn ItemNum
EndProcedure
Procedure ColumnAutoSize(GadgetID.l)
Protected GadgetHdr.l, AktColumn.l, ColumnCount.l
GadgetHdr = SendMessage_(GadgetID,#LVM_GETHEADER,0,0)
ColumnCount = SendMessage_(GadgetHdr,#HDM_GETITEMCOUNT,#Null,#Null)-1
For AktColumn=0 To ColumnCount : SendMessage_(GadgetID,#LVM_SETCOLUMNWIDTH,AktColumn,#LVSCW_AUTOSIZE_USEHEADER) : Next
EndProcedure
Procedure.l WindowCallback1(hwnd, msg, wParam, lParam)
Protected result.l
Debug msg
If msg = 20 ;/??? THX sparkie http://www.purebasic.fr/english/viewtopic.php?p=85045 (modified)
ColumnAutoSize(ListIconID)
EndIf
result = CallWindowProc_(oldwproc1, hwnd, msg, wParam, lParam)
ProcedureReturn result
EndProcedure
Procedure.l WindowCallback(hwnd, msg, wParam, lParam)
Protected *nmhdr.NMHDR, lpht.TV_HITTESTINFO
Protected result.l, itemID.l, itemNo.l, itemState.l, itemString.s, ListPos.l
result = CallWindowProc_(oldwproc, hwnd, msg, wParam, lParam)
If msg = #WM_KEYDOWN ;/ THX breeze4me http://www.purebasic.fr/english/viewtopic.php?p=158317 (modyfied)
If wParam = #VK_SPACE
itemID = SendMessage_(ExplorerTreeID, #TVM_GETNEXTITEM, #TVGN_CARET,0)
itemNo = GetItemNumber(ExplorerTreeID,itemID)
itemState = (SendMessage_(ExplorerTreeID, #TVM_GETITEMSTATE, itemID, #TVIS_STATEIMAGEMASK)>>12) - 1
itemString = GetGadgetText(ExplorerTreeNo)
ListPos = IsInList(ListIconNo,itemString)
If itemState
If ListPos=-1
AddGadgetItem(ListIconNo,-1,"KEYBOARD"+Chr(10)+Str(itemID)+Chr(10)+Str(itemNo)+Chr(10)+Str(itemState)+Chr(10)+GetGadgetText(ExplorerTreeNo))
EndIf
Else
If ListPos>-1
RemoveGadgetItem(ListIconNo,ListPos)
EndIf
EndIf
ColumnAutoSize(ListIconID)
EndIf
EndIf
If msg= #WM_LBUTTONDOWN ;/ THX breeze4me http://www.purebasic.fr/english/viewtopic.php?p=158317 (modyfied)
GetCursorPos_(@lpht\pt)
ScreenToClient_(ExplorerTreeID,lpht\pt)
itemID = SendMessage_(ExplorerTreeID,#TVM_HITTEST,0,lpht)
SendMessage_(ExplorerTreeID,#TVM_SELECTITEM,#TVGN_CARET,itemID)
itemNo = GetItemNumber(ExplorerTreeID,itemID)
itemState = (SendMessage_(ExplorerTreeID, #TVM_GETITEMSTATE, itemID, #TVIS_STATEIMAGEMASK)>>12) - 1
itemString = GetGadgetText(ExplorerTreeNo)
ListPos = IsInList(ListIconNo,itemString)
If itemState
If ListPos=-1
AddGadgetItem(ListIconNo,-1,"MOUSE"+Chr(10)+Str(itemID)+Chr(10)+Str(itemNo)+Chr(10)+Str(itemState)+Chr(10)+GetGadgetText(ExplorerTreeNo))
EndIf
Else
If ListPos>-1
RemoveGadgetItem(ListIconNo,ListPos)
EndIf
EndIf
ColumnAutoSize(ListIconID)
EndIf
ProcedureReturn result
EndProcedure
If OpenWindow(0, 0, 0, 800, 500, "ExplorerTreeGadget: CheckboxHandler (Mouse+Keyboard)", #PB_Window_SystemMenu|#PB_Window_ScreenCentered|#PB_Window_SizeGadget|#PB_Window_MinimizeGadget|#PB_Window_MaximizeGadget)
ExplorerTreeNo = ExplorerTreeGadget(#PB_Any,0,0,0,0,"")
ExplorerTreeID = GadgetID(ExplorerTreeNo)
ListIconNo = ListIconGadget(#PB_Any,0,0,0,0,"EVENT",80,#PB_ListIcon_FullRowSelect| #PB_ListIcon_AlwaysShowSelection);|#LVS_NOCOLUMNHEADER)
ListIconID = GadgetID(ListIconNo)
AddGadgetColumn(ListIconNo, 1, "ItemID", 70) : AddGadgetColumn(ListIconNo, 2, "ItemNo", 70) : AddGadgetColumn(ListIconNo, 3, "ItemState", 80) : AddGadgetColumn(ListIconNo, 4, "ItemValue", 200)
SplitterNo = SplitterGadget(#PB_Any,5,5,WindowWidth(0)-10,WindowHeight(0)-10,ExplorerTreeNo,ListIconNo,#PB_Splitter_Vertical|#PB_Splitter_FirstFixed)
SplitterID = GadgetID(SplitterNo)
TreeViewSetCheckBox(ExplorerTreeNo)
oldwproc = SetWindowLong_(ExplorerTreeID, #GWL_WNDPROC, @WindowCallback())
oldwproc1 = SetWindowLong_(SplitterID, #GWL_WNDPROC, @WindowCallback1())
Repeat
MainWindowEvent = WaitWindowEvent()
Select MainWindowEvent
Case #WM_SIZE
ResizeGadget(SplitterNo,#PB_Ignore,#PB_Ignore,(WindowWidth(0)-10),WindowHeight(0)-10)
ColumnAutoSize(ListIconID)
EndSelect
Until MainWindowEvent = #PB_Event_CloseWindow
EndIf