I try to mix three splendids codes for a ListIcon
The first of SROD give to me the height of the cell, it works very well and have no problem

http://www.purebasic.fr/english/viewtop ... 2a#p335199
The second of NETMAESTRO give to me the coordinate of cell cliqued
http://forum.purebasic.com/english/view ... e3#p161560
The second of RASHAD fast load the ListIcon
http://www.purebasic.fr/english/viewtop ... 05#p403305
So apparently , the two codes RASHAD and NETMAESTRO are not really friends

I have try the first method to put the #NOTIFY of the RASHAD CallBack() into the NETMAESTRO ListIcon Subclassing(), but the ListIcon are empty

Code: Select all
Enumeration
#Window
#WinEntrer
#ListIcon
#StrEntrer
EndEnumeration
Structure ListIcon
PosX.i
PosY.i
ColSelec.i
LigneSelec.i
LargeurColonne.i
HauteurColonne.i
Oldlist.l
EndStructure
#LVSICF_NOINVALIDATEALL = 1
#LVN_ODCACHEHINT = #LVN_FIRST - 13
#LVM_SUBITEMHITTEST = #LVM_FIRST + 57
#MaxLignes = 350000
Global Grid.ListIcon
Global Dim myItems.s(#MaxLignes)
Procedure.I GetRowHeight(ListIconID.I) ; SROD
rc.rect\left = #LVIR_BOUNDS
SendMessage_(GadgetID(ListIconID), #LVM_GETITEMRECT, 0, rc)
height = rc\bottom - rc\top
ProcedureReturn height
EndProcedure
Procedure.s ChampEntree(*Grille.ListIcon)
If *Grille\HauteurColonne < 20
HauteurColonne = 18
Else
HauteurColonne = *Grille\HauteurColonne
EndIf
SetGadgetItemColor(#ListIcon, *Grille\LigneSelec - 1, #PB_Gadget_BackColor, #White, *Grille\ColSelec)
SetGadgetItemColor(#ListIcon, *Grille\LigneSelec - 1, #PB_Gadget_FrontColor, #Black, *Grille\ColSelec)
OpenWindow(#WinEntrer, WindowX(#Window) + *Grille\PosX, WindowY(#Window) + *Grille\PosY + *Grille\HauteurColonne, *Grille\LargeurColonne, HauteurColonne, "", #PB_Window_BorderLess)
StringGadget(#StrEntrer, 0, 0, *Grille\LargeurColonne, HauteurColonne, GetGadgetItemText(#ListIcon, *Grille\LigneSelec - 1, *Grille\ColSelec))
SetActiveGadget(#StrEntrer)
StickyWindow(#WinEntrer, #True)
SetGadgetColor(#StrEntrer, #PB_Gadget_BackColor, RGB(178, 177, 169))
AddKeyboardShortcut(#WinEntrer, #PB_Shortcut_Return, 1)
AddKeyboardShortcut(#WinEntrer, #PB_Shortcut_Escape, 2)
GetWindowRect_(WindowID(1), editrect.rect)
ClipCursor_(editrect)
Repeat
ev = WaitWindowEvent()
If EventWindow() = 1
Select ev
Case #WM_RBUTTONDOWN
Grid\PosX = 0
Grid\PosY = 0
Break
Case #PB_Event_Menu
If EventMenu() = 1
SetGadgetItemText(#ListIcon, *Grille\LigneSelec - 1, GetGadgetText(#StrEntrer), *Grille\ColSelec)
Break
Else
Grid\PosX = 0
Grid\PosY = 0
Break
EndIf
EndSelect
EndIf
Until ev = #PB_Event_CloseWindow
If IsWindow(#WinEntrer)
CloseWindow(#WinEntrer)
EndIf
ClipCursor_(0)
EndProcedure
Procedure SubClass_LV(hwnd, msg, wparam, lparam) ; NETMAESTRO
Result = CallWindowProc_(Grid\Oldlist, hwnd, msg, wparam, lparam)
Select msg
Case #WM_NOTIFY ; RASHAD
*pnmh.NMHDR = lParam
Select *pnmh\code
Case #LVN_ODCACHEHINT
result = 0
Case #LVN_GETDISPINFO
*pnmlvdi.NMLVDISPINFO = lParam
If *pnmlvdi\item\mask & #LVIF_TEXT
Field$ = StringField(PeekS(@myItems(*pnmlvdi\item\iItem)), *pnmlvdi\item\iSubItem + 1, Chr(10))
PokeS(*pnmlvdi\item\pszText, Field$)
EndIf
;
EndSelect
Case #WM_LBUTTONDBLCLK
If Grid\PosX And Grid\PosY
ChampEntree(@Grid)
Else
MessageRequester("", "Veuillez séléctionner une case auparavant")
EndIf
Case #WM_LBUTTONDOWN
If IsWindow(#WinEntrer)
CloseWindow(#WinEntrer)
EndIf
HitInfo.LVHITTESTINFO ; NETMAESTRO
Hitinfo\pt\x = WindowMouseX(#Window)
HitInfo\pt\y = WindowMouseY(#Window)
SendMessage_(GadgetID(#ListIcon), #LVM_SUBITEMHITTEST, 0, @HitInfo)
SetGadgetItemColor(#ListIcon, Grid\LigneSelec - 1, #PB_Gadget_BackColor, #White, Grid\ColSelec)
SetGadgetItemColor(#ListIcon, Grid\LigneSelec - 1, #PB_Gadget_FrontColor, #Black, Grid\ColSelec)
SetGadgetItemColor(#ListIcon, hitinfo\iitem, #PB_Gadget_BackColor, #Blue, hitinfo\iSubItem)
SetGadgetItemColor(#ListIcon, hitinfo\iitem, #PB_Gadget_FrontColor, #White, hitinfo\iSubItem)
Grid\PosX = 0
Grid\PosY = 0
Grid\LigneSelec = hitinfo\iitem + 1
Grid\ColSelec = hitinfo\iSubItem
Grid\LargeurColonne = GetGadgetItemAttribute(#ListIcon, Grid\LigneSelec, #PB_ListIcon_ColumnWidth, Grid\ColSelec)
Grid\HauteurColonne = GetRowHeight(#ListIcon)
For Lig = 0 To Grid\LigneSelec ; Ligne
Grid\PosY + GetRowHeight(#ListIcon)
Next
For Col = 1 To Grid\ColSelec ; Colonne
Grid\PosX + GetGadgetItemAttribute(#ListIcon, Grid\LigneSelec, #PB_ListIcon_ColumnWidth, Col - 1)
Next
Grid\PosX + 6
EndSelect
ProcedureReturn Result
EndProcedure
OpenWindow(#Window, 0, 0, 640, 480, "ListIcon Gadget Mischief: Edit Selected Item", $CF0001)
ListIconGadget(#ListIcon, 0, 0, 640, 480, "", 0, #PB_ListIcon_GridLines|#LVS_OWNERDATA)
AddGadgetColumn(#ListIcon, 1, "Column 1", 210)
AddGadgetColumn(#ListIcon, 2, "Column 2", 210)
AddGadgetColumn(#ListIcon, 3, "Column 3", 215)
SendMessage_(GadgetID(#ListIcon), #LVM_SETITEMCOUNT, #MaxLignes, #LVSICF_NOINVALIDATEALL) ; RASHAD
Grid\Oldlist = SetWindowLong_(GadgetID(#ListIcon), #GWL_WNDPROC, @SubClass_LV()) ; NETMAESTRO
For i=0 To #MaxLignes
myItems(i) = Trim(Str(i)) + Chr(10) + "Hello" + Chr(10) + "i'm" + Chr(10) + "KCC " + Trim(Str(i))
Next i
Repeat
ev = WaitWindowEvent()
Until ev = #PB_Event_CloseWindow

Code: Select all
; http://forum.purebasic.com/english/viewtopic.php?p=161560&sid=1ae821fb59eee6783c37324226c924e3#p161560
Enumeration
#Window
#WinEntrer
#ListIcon
#StrEntrer
EndEnumeration
Structure ListIcon
PosX.i
PosY.i
ColSelec.i
LigneSelec.i
LargeurColonne.i
HauteurColonne.i
Oldlist.l
EndStructure
#LVSICF_NOINVALIDATEALL = 1
#LVN_ODCACHEHINT = #LVN_FIRST - 13
#LVM_SUBITEMHITTEST = #LVM_FIRST + 57
#MaxLignes = 350000
Global Grid.ListIcon
Global Dim myItems.s(#MaxLignes)
Procedure.I GetRowHeight(ListIconID.I) ; SROD
rc.rect\left = #LVIR_BOUNDS
SendMessage_(GadgetID(ListIconID), #LVM_GETITEMRECT, 0, rc)
height = rc\bottom - rc\top
ProcedureReturn height
EndProcedure
Procedure.s ChampEntree(*Grille.ListIcon)
If *Grille\HauteurColonne < 20
HauteurColonne = 18
Else
HauteurColonne = *Grille\HauteurColonne
EndIf
SetGadgetItemColor(#ListIcon, *Grille\LigneSelec - 1, #PB_Gadget_BackColor, #White, *Grille\ColSelec)
SetGadgetItemColor(#ListIcon, *Grille\LigneSelec - 1, #PB_Gadget_FrontColor, #Black, *Grille\ColSelec)
OpenWindow(#WinEntrer, WindowX(#Window) + *Grille\PosX, WindowY(#Window) + *Grille\PosY + *Grille\HauteurColonne, *Grille\LargeurColonne, HauteurColonne, "", #PB_Window_BorderLess)
StringGadget(#StrEntrer, 0, 0, *Grille\LargeurColonne, HauteurColonne, GetGadgetItemText(#ListIcon, *Grille\LigneSelec - 1, *Grille\ColSelec))
SetActiveGadget(#StrEntrer)
StickyWindow(#WinEntrer, #True)
SetGadgetColor(#StrEntrer, #PB_Gadget_BackColor, RGB(178, 177, 169))
AddKeyboardShortcut(#WinEntrer, #PB_Shortcut_Return, 1)
AddKeyboardShortcut(#WinEntrer, #PB_Shortcut_Escape, 2)
GetWindowRect_(WindowID(1), editrect.rect)
ClipCursor_(editrect)
Repeat
ev = WaitWindowEvent()
If EventWindow() = 1
Select ev
Case #WM_RBUTTONDOWN
Grid\PosX = 0
Grid\PosY = 0
Break
Case #PB_Event_Menu
If EventMenu() = 1
SetGadgetItemText(#ListIcon, *Grille\LigneSelec - 1, GetGadgetText(#StrEntrer), *Grille\ColSelec)
Break
Else
Grid\PosX = 0
Grid\PosY = 0
Break
EndIf
EndSelect
EndIf
Until ev = #PB_Event_CloseWindow
If IsWindow(#WinEntrer)
CloseWindow(#WinEntrer)
EndIf
ClipCursor_(0)
EndProcedure
Procedure WinCallback(hwnd, msg, wParam, lParam) ; RASHAD
result = #PB_ProcessPureBasicEvents
Select msg
Case #WM_NOTIFY
*pnmh.NMHDR = lParam
Select *pnmh\code
Case #LVN_ODCACHEHINT
result = 0
Case #LVN_GETDISPINFO
*pnmlvdi.NMLVDISPINFO = lParam
If *pnmlvdi\item\mask & #LVIF_TEXT
Field$ = StringField(PeekS(@myItems(*pnmlvdi\item\iItem)), *pnmlvdi\item\iSubItem + 1, Chr(10))
PokeS(*pnmlvdi\item\pszText, Field$)
EndIf
;
EndSelect
EndSelect
ProcedureReturn result
EndProcedure
Procedure SubClass_LV(hwnd, msg, wparam, lparam) ; NETMAESTRO
Result = CallWindowProc_(Grid\Oldlist, hwnd, msg, wparam, lparam)
Select msg
Case #WM_LBUTTONDBLCLK
If Grid\PosX And Grid\PosY
ChampEntree(@Grid)
Else
MessageRequester("", "Veuillez séléctionner une case auparavant")
EndIf
Case #WM_LBUTTONDOWN
If IsWindow(#WinEntrer)
CloseWindow(#WinEntrer)
EndIf
HitInfo.LVHITTESTINFO
Hitinfo\pt\x = WindowMouseX(#Window)
HitInfo\pt\y = WindowMouseY(#Window)
SendMessage_(GadgetID(#ListIcon), #LVM_SUBITEMHITTEST, 0, @HitInfo)
SetGadgetItemColor(#ListIcon, Grid\LigneSelec - 1, #PB_Gadget_BackColor, #White, Grid\ColSelec)
SetGadgetItemColor(#ListIcon, Grid\LigneSelec - 1, #PB_Gadget_FrontColor, #Black, Grid\ColSelec)
SetGadgetItemColor(#ListIcon, hitinfo\iitem, #PB_Gadget_BackColor, #Blue, hitinfo\iSubItem)
SetGadgetItemColor(#ListIcon, hitinfo\iitem, #PB_Gadget_FrontColor, #White, hitinfo\iSubItem)
Grid\PosX = 0
Grid\PosY = 0
Grid\LigneSelec = hitinfo\iitem + 1
Grid\ColSelec = hitinfo\iSubItem
Grid\LargeurColonne = GetGadgetItemAttribute(#ListIcon, Grid\LigneSelec, #PB_ListIcon_ColumnWidth, Grid\ColSelec)
Grid\HauteurColonne = GetRowHeight(#ListIcon)
For Lig = 0 To Grid\LigneSelec ; Ligne
Grid\PosY + GetRowHeight(#ListIcon)
Next
For Col = 1 To Grid\ColSelec ; Colonne
Grid\PosX + GetGadgetItemAttribute(#ListIcon, Grid\LigneSelec, #PB_ListIcon_ColumnWidth, Col - 1)
Next
Grid\PosX + 6
EndSelect
ProcedureReturn Result
EndProcedure
OpenWindow(#Window, 0, 0, 640, 480, "ListIcon Gadget Mischief: Edit Selected Item", $CF0001)
ListIconGadget(#ListIcon, 0, 0, 640, 480, "", 0, #PB_ListIcon_GridLines|#LVS_OWNERDATA)
AddGadgetColumn(#ListIcon, 1, "Column 1", 210)
AddGadgetColumn(#ListIcon, 2, "Column 2", 210)
AddGadgetColumn(#ListIcon, 3, "Column 3", 215)
SetWindowCallback(@WinCallback())
SendMessage_(GadgetID(#ListIcon), #LVM_SETITEMCOUNT, #MaxLignes, #LVSICF_NOINVALIDATEALL) ; RASHAD
Grid\Oldlist = SetWindowLong_(GadgetID(#ListIcon), #GWL_WNDPROC, @SubClass_LV()) ; NETMAESTRO
For i=0 To #MaxLignes
myItems(i) = Trim(Str(i)) + Chr(10) + "Hello" + Chr(10) + "i'm" + Chr(10) + "KCC " + Trim(Str(i))
Next i
Repeat
ev = WaitWindowEvent()
Until ev = #PB_Event_CloseWindow

Have a good day