Advertisement
AZJIO

ListIconGadget с подсвечиванием текста

Jan 23rd, 2024 (edited)
2,010
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1.  
  2. #LV0 = 0
  3.  
  4.  
  5. Global BackColor = $3f3f3f
  6. Global ForeColor = $cccccc
  7. Global BackColorHeader = $222222
  8. Global ForeColorHeader = $72ADC0
  9. Global BorderColor = $888888
  10. ; Global HightLightBrush = CreateSolidBrush_(GetSysColor_(#COLOR_HIGHLIGHT))
  11. Global HightLightBrush = CreateSolidBrush_($423926)
  12. Global BackColorBrush = CreateSolidBrush_(BackColor)
  13. Global BackColorBrushHeader = CreateSolidBrush_(BackColorHeader)
  14.  
  15.  
  16. Global frmMain_References, hHeader
  17. Global Dim Colors(1)
  18.  
  19. Colors(0) = $8080FF
  20. Colors(1) = ForeColor
  21.  
  22. ; ---------------------------------------------------------------------------------------------------------------------
  23.  
  24. Procedure GetCharWidth(gad, c$)
  25.     ProcedureReturn SendMessage_(gad, #LVM_GETSTRINGWIDTH, 0, @c$)
  26. EndProcedure
  27.  
  28. ; это подкрашивает части пункта в ListView
  29. Procedure Callback_Win(hwnd, msg, wParam, lParam)
  30.     Protected Result, *nmhdr.NMHDR, *lvCD.NMLVCUSTOMDRAW, subItemRect.RECT, *DrawItem.DRAWITEMSTRUCT, Buffer.s
  31.     Protected *pnmcd.NMCUSTOMDRAW, hdi.hd_item
  32.     Protected thisRow, thisCol, idx
  33.     Protected t$, text$
  34.     Protected nNotifyCode
  35.     Protected *NMITEM.NMITEMACTIVATE
  36.     Protected SelectedLine
  37.  
  38.     Result = #PB_ProcessPureBasicEvents
  39.     ;;Dim LVColor(0)
  40.  
  41.     Select msg
  42.  
  43.         Case #WM_NCDESTROY ; удаление кистей, после закрытия программы
  44.             DeleteObject_(HightLightBrush)
  45.             DeleteObject_(BackColorBrush)
  46.             DeleteObject_(BackColorBrushHeader)
  47.  
  48.         Case #WM_NOTIFY
  49.             ; стандартные структуры ListView для перерисовки
  50.             *nmhdr.NMHDR = lParam
  51.             *lvCD.NMLVCUSTOMDRAW = lParam
  52.             *NMITEM.NMITEMACTIVATE = lParam
  53.            
  54. ;           если гаджет #LV0 и он пользовательская рисовка, то
  55.             If *lvCD\nmcd\hdr\hwndFrom = GadgetID(#LV0) And *lvCD\nmcd\hdr\code = #NM_CUSTOMDRAW
  56.                 Select *lvCD\nmcd\dwDrawStage
  57.                     Case #CDDS_PREPAINT
  58.                         Result = #CDRF_NOTIFYITEMDRAW
  59.                     Case #CDDS_ITEMPREPAINT
  60.                         Result = #CDRF_NOTIFYSUBITEMDRAW;
  61.                     Case #CDDS_ITEMPREPAINT | #CDDS_SUBITEM ; перерисовка пункта
  62.                         thisRow = *lvCD\nmcd\dwItemSpec ; строку
  63.                         thisCol = *lvCD\iSubItem ; колонка
  64.                         If thisCol = 0 ; если колонка 0, то
  65.                             ; Определяет прямоугольник для текста
  66. ;                           subItemRect.RECT\left = #LVIR_LABEL ; при высылки информации в эту структуру, там хранятся настройки
  67. ;                           subItemRect.RECT\top = *lvCD\iSubItem ; номер подпункта, он будет учтён перед заполнением структуры
  68.                             ; Определяет прямоугольник подпункт
  69.                             SendMessage_(GadgetID(#LV0), #LVM_GETSUBITEMRECT, thisRow, @subItemRect) ; в итоге переписываем структуру прямоугольника
  70.  
  71.                             text$ = GetGadgetItemText(#LV0, thisRow, thisCol) ; получаем текст пункта по строке и колонке
  72.  
  73.                             If GetGadgetState(#LV0) = thisRow ; если индекс выделенного элемента равен пункту, то
  74.                                 ; выделенный пункт, перекрашиваем его фон
  75.                                 FillRect_(*lvCD\nmcd\hdc, subItemRect, BackColorBrush)
  76.                             Else
  77.                                 ; не выделенный пункт, перекрашиваем его другим фоном
  78.                                 FillRect_(*lvCD\nmcd\hdc, subItemRect, BackColorBrushHeader)
  79.                             EndIf
  80.                             InflateRect_(subItemRect, -8, 0) ; изменяет левую границу прямоугольника на 8 пиксел
  81.  
  82.                             #SelectedWordMarker$ = "|" ; импортированный разделитель чтобы подсветить часть текста между разделителями.
  83.                             For idx = 1 To CountString(text$, #SelectedWordMarker$) + 1 ; до числа разделителей
  84.                                 t$ = StringField(text$, idx, #SelectedWordMarker$) ; получаем поле 1, 2, 3 по очереди
  85.                                 If t$
  86.                                     SetTextColor_(*lvCD\nmcd\hdc, colors(idx & 1)) ; чётные/нечетные части текста
  87.                                     SetBkColor_(*lvCD\nmcd\hdc, BackColor) ; фон всегда одинаковый
  88.                                     DrawText_(*lvCD\nmcd\hdc, t$, -1, subItemRect, #DT_END_ELLIPSIS | #DT_VCENTER | #DT_SINGLELINE) ; рисуем текст
  89.                                     subItemRect\left + GetCharWidth(*nmhdr\hwndFrom, t$) ; смещение от предыдущего нарисованного текста, чтобы нарисовать следующий текст. Отступ, от которого красить очередную часть нарисованную правее.
  90.                                 EndIf
  91.                             Next idx
  92.                             Result = #CDRF_SKIPDEFAULT
  93.                         Else
  94.                             Result = #CDRF_DODEFAULT
  95.                         EndIf
  96.                 EndSelect
  97.             EndIf
  98.     EndSelect
  99.     ProcedureReturn Result
  100. EndProcedure
  101.  
  102. ; это подкрашивает заголовок ListView
  103. Procedure Callback_Header(hWnd, Message, wParam, lParam)
  104.     Protected *Header.HD_NOTIFY, SelectedLine, *lvCD.NMLVCUSTOMDRAW
  105.     Protected *nmhdr.NMHDR, text$, *pnmcd.NMCUSTOMDRAW, hdi.hd_item
  106.     Protected rc2.RECT, hDC
  107.     Protected Result = CallWindowProc_(frmMain_References, hWnd, Message, wParam, lParam)
  108.  
  109.  
  110.     *Header = lParam
  111.     *nmhdr = lParam
  112.     *lvCD = lParam
  113.     Select Message
  114.         Case #WM_NOTIFY
  115.             Select *Header\hdr\code
  116.                 Case #NM_CUSTOMDRAW
  117.                     If *nmhdr\hwndFrom = hHeader
  118.                         *pnmcd.NMCUSTOMDRAW = lParam
  119.                         Select *pnmcd\dwDrawStage
  120.                             Case #CDDS_PREPAINT
  121.                                 result = #CDRF_NOTIFYITEMDRAW
  122.                             Case #CDDS_ITEMPREPAINT
  123.                                 text$ = GetGadgetItemText(GetDlgCtrlID_(hWnd), -1, *pnmcd\dwItemSpec)
  124.                                 hdi\mask = #HDI_TEXT
  125.                                 hdi\psztext = @text$
  126.                                 hdi\cchtextmax = Len(text$)
  127.                                 SetBkMode_(*pnmcd\hdc, #TRANSPARENT)
  128.                                 FillRect_(*pnmcd\hdc, *pnmcd\rc, BackColorBrushHeader)
  129.                                 ;                               сдвигаем текст после закрашивания прямоуголников
  130.                                 If *lvCD\nmcd\dwItemSpec
  131.                                     InflateRect_(*pnmcd\rc, -8, 0)
  132. ;                                   text$ = LTrimChar(text$, " " + #TAB$)
  133.                                 Else
  134.                                     InflateRect_(*pnmcd\rc, -4, 0)
  135.                                 EndIf
  136.                                 SetTextColor_(*pnmcd\hdc, ForeColorHeader)
  137.                                 DrawText_(*pnmcd\hdc, @text$, Len(text$), *pnmcd\rc, #DT_VCENTER | #DT_END_ELLIPSIS)
  138.                                 result = #CDRF_SKIPDEFAULT
  139.                         EndSelect
  140.                     EndIf
  141.             EndSelect
  142.     EndSelect
  143.     ProcedureReturn Result
  144. EndProcedure
  145.  
  146.  
  147. ;- ╔═ GUI ═╗
  148. If OpenWindow(0, 0, 0, 420, 400, "Пример...", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  149.     ;   ButtonGadget(1, 10, 10, 18, 30, Chr($205E)) ; ⁞ (меню)
  150.  
  151.     ListIconGadget(#LV0, 10, 10, 400, 380, "Колонка", 400, #PB_ListIcon_GridLines)
  152.     For a = 0 To 4
  153.         AddGadgetItem(#LV0, a, "раз-|два|-три")
  154.     Next
  155.     SetGadgetColor(#LV0, #PB_Gadget_BackColor, BackColorHeader)
  156.  
  157.  
  158.     ;     ListViewGadget(0, 10, 10, 400, 380)
  159.     ;     For a = 1 To 12
  160.     ;       AddGadgetItem(0, -1, "Элемент  " + Str(a) + "  Списка") ; Определить содержимое списка.
  161.     ;     Next
  162.     SetWindowCallback(@Callback_Win())
  163.     hHeader = SendMessage_(GadgetID(#LV0), #LVM_GETHEADER, 0, 0)
  164.     frmMain_References = SetWindowLongPtr_(GadgetID(#LV0), #GWL_WNDPROC, @Callback_Header())
  165. ;   SetBkColor_(hHeader, BackColor)
  166.  
  167.  
  168.  
  169.     ;- Loop
  170.     Repeat
  171.         Select WaitWindowEvent()
  172.             Case #PB_Event_CloseWindow
  173.                 CloseWindow(0)
  174.                 End
  175.         EndSelect
  176.     ForEver
  177. EndIf
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement