Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #LV0 = 0
- Global BackColor = $3f3f3f
- Global ForeColor = $cccccc
- Global BackColorHeader = $222222
- Global ForeColorHeader = $72ADC0
- Global BorderColor = $888888
- ; Global HightLightBrush = CreateSolidBrush_(GetSysColor_(#COLOR_HIGHLIGHT))
- Global HightLightBrush = CreateSolidBrush_($423926)
- Global BackColorBrush = CreateSolidBrush_(BackColor)
- Global BackColorBrushHeader = CreateSolidBrush_(BackColorHeader)
- Global frmMain_References, hHeader
- Global Dim Colors(1)
- Colors(0) = $8080FF
- Colors(1) = ForeColor
- ; ---------------------------------------------------------------------------------------------------------------------
- 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, *DrawItem.DRAWITEMSTRUCT, Buffer.s
- Protected *pnmcd.NMCUSTOMDRAW, hdi.hd_item
- Protected thisRow, thisCol, idx
- Protected t$, text$
- Protected nNotifyCode
- Protected *NMITEM.NMITEMACTIVATE
- Protected SelectedLine
- 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_LABEL ; при высылки информации в эту структуру, там хранятся настройки
- ; subItemRect.RECT\top = *lvCD\iSubItem ; номер подпункта, он будет учтён перед заполнением структуры
- ; Определяет прямоугольник подпункт
- SendMessage_(GadgetID(#LV0), #LVM_GETSUBITEMRECT, thisRow, @subItemRect) ; в итоге переписываем структуру прямоугольника
- text$ = GetGadgetItemText(#LV0, thisRow, thisCol) ; получаем текст пункта по строке и колонке
- If GetGadgetState(#LV0) = thisRow ; если индекс выделенного элемента равен пункту, то
- ; выделенный пункт, перекрашиваем его фон
- FillRect_(*lvCD\nmcd\hdc, subItemRect, BackColorBrush)
- Else
- ; не выделенный пункт, перекрашиваем его другим фоном
- FillRect_(*lvCD\nmcd\hdc, subItemRect, BackColorBrushHeader)
- EndIf
- InflateRect_(subItemRect, -8, 0) ; изменяет левую границу прямоугольника на 8 пиксел
- #SelectedWordMarker$ = "|" ; импортированный разделитель чтобы подсветить часть текста между разделителями.
- For idx = 1 To CountString(text$, #SelectedWordMarker$) + 1 ; до числа разделителей
- t$ = StringField(text$, idx, #SelectedWordMarker$) ; получаем поле 1, 2, 3 по очереди
- If t$
- SetTextColor_(*lvCD\nmcd\hdc, colors(idx & 1)) ; чётные/нечетные части текста
- SetBkColor_(*lvCD\nmcd\hdc, BackColor) ; фон всегда одинаковый
- DrawText_(*lvCD\nmcd\hdc, t$, -1, subItemRect, #DT_END_ELLIPSIS | #DT_VCENTER | #DT_SINGLELINE) ; рисуем текст
- subItemRect\left + GetCharWidth(*nmhdr\hwndFrom, t$) ; смещение от предыдущего нарисованного текста, чтобы нарисовать следующий текст. Отступ, от которого красить очередную часть нарисованную правее.
- EndIf
- Next idx
- Result = #CDRF_SKIPDEFAULT
- Else
- Result = #CDRF_DODEFAULT
- EndIf
- EndSelect
- EndIf
- EndSelect
- ProcedureReturn Result
- EndProcedure
- ; это подкрашивает заголовок ListView
- Procedure Callback_Header(hWnd, Message, wParam, lParam)
- Protected *Header.HD_NOTIFY, SelectedLine, *lvCD.NMLVCUSTOMDRAW
- Protected *nmhdr.NMHDR, text$, *pnmcd.NMCUSTOMDRAW, hdi.hd_item
- Protected rc2.RECT, hDC
- Protected Result = CallWindowProc_(frmMain_References, hWnd, Message, wParam, lParam)
- *Header = lParam
- *nmhdr = lParam
- *lvCD = lParam
- Select Message
- Case #WM_NOTIFY
- Select *Header\hdr\code
- Case #NM_CUSTOMDRAW
- If *nmhdr\hwndFrom = hHeader
- *pnmcd.NMCUSTOMDRAW = lParam
- Select *pnmcd\dwDrawStage
- Case #CDDS_PREPAINT
- result = #CDRF_NOTIFYITEMDRAW
- Case #CDDS_ITEMPREPAINT
- text$ = GetGadgetItemText(GetDlgCtrlID_(hWnd), -1, *pnmcd\dwItemSpec)
- hdi\mask = #HDI_TEXT
- hdi\psztext = @text$
- hdi\cchtextmax = Len(text$)
- SetBkMode_(*pnmcd\hdc, #TRANSPARENT)
- FillRect_(*pnmcd\hdc, *pnmcd\rc, BackColorBrushHeader)
- ; сдвигаем текст после закрашивания прямоуголников
- If *lvCD\nmcd\dwItemSpec
- InflateRect_(*pnmcd\rc, -8, 0)
- ; text$ = LTrimChar(text$, " " + #TAB$)
- Else
- InflateRect_(*pnmcd\rc, -4, 0)
- EndIf
- SetTextColor_(*pnmcd\hdc, ForeColorHeader)
- DrawText_(*pnmcd\hdc, @text$, Len(text$), *pnmcd\rc, #DT_VCENTER | #DT_END_ELLIPSIS)
- result = #CDRF_SKIPDEFAULT
- EndSelect
- EndIf
- EndSelect
- EndSelect
- ProcedureReturn Result
- EndProcedure
- ;- ╔═ GUI ═╗
- If OpenWindow(0, 0, 0, 420, 400, "Пример...", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
- ; ButtonGadget(1, 10, 10, 18, 30, Chr($205E)) ; ⁞ (меню)
- ListIconGadget(#LV0, 10, 10, 400, 380, "Колонка", 400, #PB_ListIcon_GridLines)
- For a = 0 To 4
- AddGadgetItem(#LV0, a, "раз-|два|-три")
- Next
- SetGadgetColor(#LV0, #PB_Gadget_BackColor, BackColorHeader)
- ; ListViewGadget(0, 10, 10, 400, 380)
- ; For a = 1 To 12
- ; AddGadgetItem(0, -1, "Элемент " + Str(a) + " Списка") ; Определить содержимое списка.
- ; Next
- SetWindowCallback(@Callback_Win())
- hHeader = SendMessage_(GadgetID(#LV0), #LVM_GETHEADER, 0, 0)
- frmMain_References = SetWindowLongPtr_(GadgetID(#LV0), #GWL_WNDPROC, @Callback_Header())
- ; SetBkColor_(hHeader, BackColor)
- ;- Loop
- Repeat
- Select WaitWindowEvent()
- Case #PB_Event_CloseWindow
- CloseWindow(0)
- End
- EndSelect
- ForEver
- EndIf
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement