I've made my own versions and they're similar to yours. Maybe I should have waited a bit.
Code: Select all
Global ListIcon_ID, hImgList
Define hIcon1, hIcon2, hIcon3
Define Size = 32
; Добавляем иконки прог
ExtractIconEx_("Shell32.dll", 161, @hIcon1, 0, 1)
ExtractIconEx_("Shell32.dll", 0, @hIcon2, 0, 1)
ExtractIconEx_("Shell32.dll", 3, @hIcon3, 0, 1)
Procedure AddItem(idxLV, idxImage, text$, pos = -1)
Protected item.LVITEM
item\mask = #LVIF_TEXT | #LVIF_PARAM | #LVIF_IMAGE
item\iItem = idxLV
item\iImage = idxImage
item\pszText = @text$
SendMessage_(GadgetID(ListIcon_ID), #LVM_INSERTITEMW, pos, @item)
ProcedureReturn 0
EndProcedure
If OpenWindow(0, 0, 0, 400, 350, "Example", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
ListIcon_ID = ListIconGadget(#PB_Any, 5, 5, 390, 340, "Файлы", 200, #PB_ListIcon_FullRowSelect | #LVS_NOCOLUMNHEADER)
hImgList = ImageList_Create_(Size, Size, #ILC_COLOR32 | #ILC_MASK, 1, 1)
; Подготовим тестовую иконку (квадрат) нужного размера
ImageList_AddIcon_(hImgList, hIcon1)
ImageList_AddIcon_(hImgList, hIcon2)
ImageList_AddIcon_(hImgList, hIcon3)
; Иконки уже в ImageList, оригинал можно удалить
DestroyIcon_(hIcon1)
DestroyIcon_(hIcon2)
DestroyIcon_(hIcon3)
SendMessage_(GadgetID(ListIcon_ID), #LVM_SETIMAGELIST, #LVSIL_SMALL, hImgList)
; 4. Добавляем данные
For i = 0 To 2
AddItem(i, i, "Program: " + Str(i))
Next
Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
EndIf
I've redone the second example from
this example.
Code: Select all
Global hIcon = 0
Global hIcon2 = 0
ExtractIconEx_("Shell32.dll", 161, @hIcon, 0, 1)
ExtractIconEx_("Shell32.dll", 0, @hIcon2, 0, 1)
; ExtractIconEx_("C:\ProgramData\PureBasic\Examples\Sources\Data\CdPlayer.ico", 0, 0, @hIcon, 1)
; Debug hIcon
Global g_tRect.RECT
With g_tRect
\left = 0
\top = 0
\right = 32
\bottom = 32
EndWith
Global hDC
#LV0 = 0
Global BackColor = $00FF00
Global ForeColor = $FF0000
Global BackColorHeader = $eeffee
Global ForeColorHeader = $2277ff
Global BorderColor = $0
Global HightLightBrush = CreateSolidBrush_(GetSysColor_(#COLOR_HIGHLIGHT))
; Global HightLightBrush = CreateSolidBrush_($ff3926)
Global BackColorBrush = CreateSolidBrush_(BackColor)
Global BackColorBrushHeader = CreateSolidBrush_(BackColorHeader)
; ---------------------------------------------------------------------------------------------------------------------
Procedure GetCharWidth(gad, c$)
ProcedureReturn SendMessage_(gad, #LVM_GETSTRINGWIDTH, 0, @c$)
EndProcedure
; это подкрашивает пункты в ListView
Procedure Callback_Win(hwnd, msg, wParam, lParam)
Protected Result, *nmhdr.NMHDR, *lvCD.NMLVCUSTOMDRAW, subItemRect.RECT
Protected thisRow, thisCol
Protected text$
Protected *NMITEM.NMITEMACTIVATE
; Protected nNotifyCode
Result = #PB_ProcessPureBasicEvents
;;Dim LVColor(0)
Select msg
Case #WM_NCDESTROY ; удаление кистей, после закрытия программы
DeleteObject_(HightLightBrush)
DeleteObject_(BackColorBrush)
DeleteObject_(BackColorBrushHeader)
Case #WM_NOTIFY
; стандартные структуры ListView для перерисовки
*nmhdr.NMHDR = lParam
*lvCD.NMLVCUSTOMDRAW = lParam
*NMITEM.NMITEMACTIVATE = lParam
; если гаджет #LV0 и он пользовательская рисовка, то
If *lvCD\nmcd\hdr\hwndFrom = GadgetID(#LV0) And *lvCD\nmcd\hdr\code = #NM_CUSTOMDRAW
Select *lvCD\nmcd\dwDrawStage
Case #CDDS_PREPAINT
Result = #CDRF_NOTIFYITEMDRAW
Case #CDDS_ITEMPREPAINT
Result = #CDRF_NOTIFYSUBITEMDRAW;
Case #CDDS_ITEMPREPAINT | #CDDS_SUBITEM ; перерисовка пункта
thisRow = *lvCD\nmcd\dwItemSpec ; строку
thisCol = *lvCD\iSubItem ; колонка
If thisCol =0 ; если колонка 0, то
; Определяет прямоугольник для текста
subItemRect.RECT\left = #LVIR_BOUNDS ; #LVIR_ICON, #LVIR_LABEL
subItemRect.RECT\top = *lvCD\iSubItem ; iSubItem
; Определяет прямоугольник подпункт
SendMessage_(GadgetID(#LV0), #LVM_GETSUBITEMRECT, thisRow, @subItemRect) ; в итоге переписываем структуру прямоугольника
; subItemRect.RECT\left + 160
text$ = GetGadgetItemText(#LV0, thisRow, thisCol) ; получаем текст пункта по строке и колонке
If GetGadgetState(#LV0) = thisRow ; если индекс выделенного элемента равен пункту, то
; выделенный пункт, перекрашиваем его фон
FillRect_(*lvCD\nmcd\hdc, subItemRect, HightLightBrush)
SetTextColor_(*lvCD\nmcd\hdc, $00FFFF) ;
Else
; не выделенный пункт, перекрашиваем его другим фоном
FillRect_(*lvCD\nmcd\hdc, subItemRect, BackColorBrushHeader)
SetTextColor_(*lvCD\nmcd\hdc, ForeColor) ;
EndIf
CopyStructure(@subItemRect, @g_tRect, RECT)
InflateRect_(subItemRect, -46, 0) ; изменяет левую границу прямоугольника на 8 пиксел (уже другое)
SetBkColor_(*lvCD\nmcd\hdc, BackColorHeader) ; фон всегда одинаковый, он вообще не нужен
DrawText_(*lvCD\nmcd\hdc, text$, -1, subItemRect, #DT_END_ELLIPSIS | #DT_VCENTER | #DT_SINGLELINE) ; рисуем текст
With g_tRect
\left + 0
\right = \left + 12
\top + 1
\bottom = \top + 12
EndWith
If thisRow % 2
DrawIconEx_(*lvCD\nmcd\hdc, g_tRect\left, g_tRect\top, hIcon, 32, 32, 0, 0, #DI_NORMAL)
Else
DrawIconEx_(*lvCD\nmcd\hdc, g_tRect\left, g_tRect\top, hIcon2, 32, 32, 0, 0, #DI_NORMAL)
EndIf
Result = #CDRF_SKIPDEFAULT
Else
Result = #CDRF_DODEFAULT
EndIf
EndSelect
EndIf
EndSelect
ProcedureReturn Result
EndProcedure
;- ╔═ GUI ═╗
If OpenWindow(0, 0, 0, 420, 400, "Пример...", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
If LoadFont(0, "Segoe UI", 15)
SetGadgetFont(#PB_Default, FontID(0)) ; Установить загруженный шрифт Arial 16 как новый стандарт
EndIf
ListIconGadget(#LV0, 10, 10, 400, 380, "Col0", 250, #PB_ListIcon_GridLines | #PB_ListIcon_FullRowSelect | #PB_ListIcon_NoHeaders)
For a = 1 To 6
AddGadgetItem(#LV0, -1, "Программа " + Str(a) )
Next
SetGadgetColor(#LV0, #PB_Gadget_BackColor, BackColorHeader)
SetWindowCallback(@Callback_Win())
;- Loop
Repeat
Select WaitWindowEvent()
Case #PB_Event_CloseWindow
; for ExtractIconEx
DestroyIcon_(hIcon)
DestroyIcon_(hIcon2)
CloseWindow(0)
End
EndSelect
ForEver
EndIf