Bon et puis zut ... je vais me faire un café, c'est l'heure de ma récré. Voila un snip + complet avec gestion des colonnes, des couleurs de lignes, et possibilité de tri des lignes du ListIcon.
A partir de là, si besoin est encore, la gestion des entrées clavier peut se faire de 2 façons :
- soit par récupération de #WM_CHAR dans le callback ColumnClickCallback()
- soit par ajout de KeyboardShortcut() dans le prog principal
Je stoppe là pour l'instant.
Code : Tout sélectionner
#Window_Main = 0
#Gadget_ListIcon = 1
Global hListIconGadget.l
#LVM_SETEXTENDEDLISTVIEWSTYLE = #LVM_FIRST + 54
#LVM_GETEXTENDEDLISTVIEWSTYLE = #LVM_FIRST + 55
#ListIconTextColor1 = $5F0000
#ListIconBackgroundColor1 = $D0FFFF
#ListIconTextColor2 = $D0FFFF
#ListIconBackgroundColor2 = $5F0000
#NM_CUSTOMDRAW = #NM_FIRST - 12
#CDDS_ITEM = $10000
#CDDS_PREPAINT = $1
#CDDS_ITEMPREPAINT = #CDDS_ITEM | #CDDS_PREPAINT
#CDRF_DODEFAULT = $0
#CDRF_NOTIFYITEMDRAW = $20
#PB_Shortcut_CTRL_F = $6
Global Buffer1.l, Buffer2.l, lvi.LV_ITEM, updown.l, lastcol.l
Buffer1 = AllocateMemory(128)
Buffer2 = AllocateMemory(128)
Procedure CompareFunc(item1, item2, lParamSort)
result = 0
lvi\iSubItem = lParamSort
lvi\pszText = Buffer1
lvi\cchTextMax = 128
lvi\mask = #LVIF_TEXT
SendMessage_(hListIconGadget, #LVM_GETITEMTEXT, item1, @lvi)
lvi\pszText = Buffer2
SendMessage_(hListIconGadget, #LVM_GETITEMTEXT, item2, @lvi)
Seeker1 = Buffer1
Seeker2 = Buffer2
done = #FALSE
Repeat
char1 = Asc(UCase(Chr(PeekB(Seeker1))))
char2 = Asc(UCase(Chr(PeekB(Seeker2))))
result = (char1 - char2) * updown
If result <> 0 Or (Seeker1 - Buffer1) > 127
done = #TRUE
EndIf
Seeker1 + 1
Seeker2 + 1
Until Done
ProcedureReturn result
EndProcedure
Procedure UpdatelParam()
ItemCount = SendMessage_(hListIconGadget, #LVM_GETITEMCOUNT, 0, 0)
lvi\mask = #LVIF_PARAM
lvi\iItem = 0
While ItemCount > 0
lvi\lParam = lvi\iItem
For SubItem = 0 To 3
lvi\iSubItem = SubItem
SendMessage_(hListIconGadget, #LVM_SETITEM, 0, @lvi)
Next SubItem
lvi\iItem = lvi\iItem + 1
ItemCount = ItemCount - 1
Wend
EndProcedure
Procedure ColumnClickCallback(Handle, Message, wParam, lParam)
Result = #PB_ProcessPureBasicEvents
Select Message
Case #WM_NOTIFY
*msg.NMHDR = lParam
If *msg\hwndFrom = hListIconGadget And *msg\code = #LVN_COLUMNCLICK
*pnmv.NM_LISTVIEW = lParam
If lastcol <> *pnmv\iSubItem
updown = 1
EndIf
SendMessage_(hListIconGadget, #LVM_SORTITEMS, *pnmv\iSubItem, @CompareFunc())
UpdatelParam()
UpdateWindow_(hListIconGadget)
lastcol = *pnmv\iSubItem
updown = -updown
EndIf
*LVCDHeader.NMLVCUSTOMDRAW = lParam
If *LVCDHeader\nmcd\hdr\hWndFrom = hListIconGadget And *LVCDHeader\nmcd\hdr\code = #NM_CUSTOMDRAW
Select *LVCDHeader\nmcd\dwDrawStage
Case #CDDS_PREPAINT
ProcedureReturn #CDRF_NOTIFYITEMDRAW
Case #CDDS_ITEMPREPAINT
Row.l = *LVCDHeader\nmcd\dwItemSpec
If (Row / 2) * 2 = Row
*LVCDHeader\clrText = #ListIconTextColor1
*LVCDHeader\clrTextBk = #ListIconBackgroundColor1
Else
*LVCDHeader\clrText = #ListIconTextColor2
*LVCDHeader\clrTextBk = #ListIconBackgroundColor2
EndIf
ProcedureReturn #CDRF_DODEFAULT
EndSelect
EndIf
Case #WM_LBUTTONDOWN
ReleaseCapture_()
SendMessage_(WindowID(), #WM_NCLBUTTONDOWN, #HTCAPTION, #NULL)
Case #WM_PAINT
HideWindow(#Window_Main, 1)
HideWindow(#Window_Main, 0)
Case #WM_SIZE
If Handle = WindowID() And IsIconic_(Handle) = 0
WindowWidth = lParam & $ffff
WindowHeight = lParam >> 16
ResizeGadget(#Gadget_ListIcon, 25, 25, WindowWidth - 50, WindowHeight - 50)
Result = 1
EndIf
EndSelect
ProcedureReturn Result
EndProcedure
;
;
;
Quit = #FALSE
WindowXSize = 320
WindowYSize = 240
If OpenWindow(#Window_Main, 0, 0, WindowXSize, WindowYSize, #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget | #PB_Window_SizeGadget | #PB_Window_TitleBar | #PB_Window_ScreenCentered, "MyWindow")
AddKeyboardShortcut(#Window_Main, #PB_Shortcut_Escape, #PB_Shortcut_Escape)
If CreateGadgetList(WindowID())
hListIconGadget = ListIconGadget(#Gadget_ListIcon, 10, 10, WindowXSize - 20, WindowYSize - 35, "Col1", 120, #PB_ListIcon_MultiSelect | #PB_ListIcon_GridLines | #PB_ListIcon_FullRowSelect | #PB_ListIcon_HeaderDragDrop | #PB_ListIcon_AlwaysShowSelection)
AddGadgetColumn(#Gadget_ListIcon, 1, "Col2", 120)
AddGadgetColumn(#Gadget_ListIcon, 2, "Col3", 120)
AddGadgetColumn(#Gadget_ListIcon, 3, "Col4", 120)
EndIf
For i = 1 To 20
Text.s = ""
For j = 0 To 4
For k = 1 To Random(5) + 3
Text = Text + Chr(Random(25) + 65)
Next
Text + Chr(10)
Next
AddGadgetItem(#Gadget_ListIcon, -1, Text)
Next
If CreateStatusBar(#Window_Main, WindowID())
EndIf
updown = 1
lastcol = 0
UpdatelParam()
SetWindowCallback(@ColumnClickCallback())
Repeat
Wevent = WaitWindowEvent()
Select WEvent
Case #PB_Event_CloseWindow
Quit = #TRUE
Case #PB_Event_Menu
Select EventMenuID()
Case #PB_Shortcut_Escape
Quit = #TRUE
EndSelect
Case #PB_EventGadget
Select EventGadgetID()
Case #Gadget_ListIcon
If Item <> GetGadgetState(#Gadget_ListIcon)
If Abs(Item - GetGadgetState(#Gadget_ListIcon)) <> Item - GetGadgetState(#Gadget_ListIcon)
Debug "vers le bas"
Else
Debug "vers le haut"
EndIf
Debug "ListIcon state=" + Str(GetGadgetState(#Gadget_ListIcon))
Debug "ListIcon text=" + GetGadgetText(#Gadget_ListIcon)
Debug "ListIcon ItemState=" + Str(GetGadgetItemState(#Gadget_ListIcon, GetGadgetState(#Gadget_ListIcon)))
Debug "ListIcon ItemText=" + GetGadgetItemText(#Gadget_ListIcon, Item, 0)
Debug "ListIcon ItemText=" + GetGadgetItemText(#Gadget_ListIcon, Item, 1)
Debug "ListIcon ItemText=" + GetGadgetItemText(#Gadget_ListIcon, Item, 2)
Debug "ListIcon ItemText=" + GetGadgetItemText(#Gadget_ListIcon, Item, 3)
Item = GetGadgetState(#Gadget_ListIcon)
EndIf
Select EventType()
Case #PB_EventType_LeftClick
Case #PB_EventType_RightClick
Case #PB_EventType_LeftDoubleClick
Case #PB_EventType_RightDoubleClick
EndSelect
EndSelect
EndSelect
Until Quit
EndIf
TerminateProcess_(GetCurrentProcess_(), 0)
End