Что нового

Работа с виртуальным ListView. Цветной список

pvnn

Осваивающий
Сообщения
305
Репутация
32
Всем доброго времени суток
Необходим совет.
Есть виртуальный ListView. Можно ли его покрасить в зависимости от условий, например если значение в первом столбце='СтрокаI 5', то выделить строку зеленым цветом.
У меня пока получилось только весь список выделить цветом
Код:
; Виртуальный ListView

#include <GUIConstants.au3>
#include <WindowsConstants.au3>
#include <GuiListView.au3>
#include <Array.au3>
#include <ButtonConstants.au3>
#include <GuiListView.au3>


Global $hGui, $hEdit, $idEditSearch, $hLV, $iItems = 100000, $aItems[$iItems][3]


; Создаем массив
  For $i = 0 To $iItems - 1
	   $aItems[$i][0]='СтрокаI '&$i+1
	   $aItems[$i][1]='СтрокаII '&$i+1
	   $aItems[$i][2]='СтрокаIII '&$i+1
  Next


; Просмотр элементов массива в Виртуальном ListView
_ArrayVirtualDisplay($aItems)


Func _ArrayVirtualDisplay($aItems)
  ; Create GUI
  $hGui = GUICreate( "Virtual ListView", 300, 230 )
  Local $Button1 = GUICtrlCreateButton("Button1", 10, 8, 75, 25)
  ; Create ListView
  Local $idLV = GUICtrlCreateListView( "", 10, 40, 300-20, 200-20, BitOR($LVS_OWNERDATA,$LVS_SHOWSELALWAYS) )
  _GUICtrlListView_SetExtendedListViewStyle($idLV, BitOR($LVS_EX_GRIDLINES, $LVS_EX_FULLROWSELECT, $LVS_EX_SUBITEMIMAGES))

  $hLV = GUICtrlGetHandle( $idLV ) ;    Virtual listview    Reduces flicker
  _GUICtrlListView_AddColumn( $hLV, "Items1",  100 )
  _GUICtrlListView_AddColumn( $hLV, "Items2",  100 )
  _GUICtrlListView_AddColumn( $hLV, "Items3",  100 )

  ; Handle $WM_NOTIFY messages from ListView
  ; Necessary to display the rows in a virtual ListView
  GUIRegisterMsg( $WM_NOTIFY, "WM_NOTIFY" )


  ; Display items
  GUICtrlSendMsg( $idLV, $LVM_SETITEMCOUNT, $iItems, 0 )

GUISetState(@SW_SHOW)

  ; Message loop
  While 1
    Switch GUIGetMsg()
     Case $GUI_EVENT_CLOSE
        Exit
		Case $Button1
			 $hLV = GUICtrlGetHandle( $idLV )
			  $IndexListView=_GUICtrlListView_GetSelectedIndices($idLV)   	; Индекс выделенной записи
			  $Name=_GUICtrlListView_GetItemText($hLV,$IndexListView,0)	; Название
			 MsgBox(0,'',$Name)
    EndSwitch
  WEnd

EndFunc



Func WM_NOTIFY( $hWnd, $iMsg, $wParam, $lParam )
  Local Static $tText = DllStructCreate( "wchar[50]" )
  Local Static $pText = DllStructGetPtr( $tText )

  Local $tNMHDR, $hWndFrom, $iCode
  $tNMHDR = DllStructCreate( $tagNMHDR, $lParam )
  $hWndFrom = HWnd( DllStructGetData( $tNMHDR, "hWndFrom" ) )
  $iCode = DllStructGetData( $tNMHDR, "Code" )

  Switch $hWndFrom
    Case $hLV
      Switch $iCode
        Case $LVN_GETDISPINFOW
          Local $tNMLVDISPINFO = DllStructCreate( $tagNMLVDISPINFO, $lParam )

		  $ColumnNumb=DllStructGetData( $tNMLVDISPINFO, "SubItem" ) ; Номер столбца, для которого ведется опрос

          If BitAND( DllStructGetData( $tNMLVDISPINFO, "Mask" ), $LVIF_TEXT ) Then
             Local $sItem = $aItems[DllStructGetData($tNMLVDISPINFO,"Item")][$ColumnNumb]

            DllStructSetData( $tText, 1, $sItem )
            DllStructSetData( $tNMLVDISPINFO, "Text", $pText )
            DllStructSetData( $tNMLVDISPINFO, "TextMax", StringLen( $sItem ) )

		  EndIf
      EndSwitch
  EndSwitch
			 GUICtrlSetColor(-1, 0x008000)      ; Зеленый цвет
  Return $GUI_RUNDEFMSG
EndFunc
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Раскраска осуществляется обработкой NM_CUSTOMDRAW. Ищите, примеров целый вагон.
 
Автор
P

pvnn

Осваивающий
Сообщения
305
Репутация
32
Спасибо за ссылки
Сделал так:
Код:
; Виртуальный ListView

#include <GUIConstants.au3>
#include <WindowsConstants.au3>
#include <GuiListView.au3>
#include <Array.au3>
#include <ButtonConstants.au3>
#include <GuiListView.au3>

Global $hGui, $hEdit, $idEditSearch, $hLV, $iItems = 100000, $aItems[$iItems][3]


; Создаем массив
  For $i = 0 To $iItems - 1
	   $aItems[$i][0]='СтрокаI '&$i+1
	   $aItems[$i][1]='СтрокаII '&$i+1
	   $aItems[$i][2]='СтрокаIII '&$i+1
  Next


; Просмотр элементов массива в Виртуальном ListView
_ArrayVirtualDisplay($aItems)


Func _ArrayVirtualDisplay($aItems)
  ; Create GUI
  $hGui = GUICreate( "Virtual ListView", 300, 230 )
  Local $Button1 = GUICtrlCreateButton("Button1", 10, 8, 75, 25)
  ; Create ListView
  Local $idLV = GUICtrlCreateListView( "", 10, 40, 300-20, 200-20, BitOR($LVS_OWNERDATA,$LVS_SHOWSELALWAYS) )
  _GUICtrlListView_SetExtendedListViewStyle($idLV, BitOR($LVS_EX_GRIDLINES, $LVS_EX_FULLROWSELECT, $LVS_EX_SUBITEMIMAGES))

  $hLV = GUICtrlGetHandle( $idLV ) ;    Virtual listview    Reduces flicker
  _GUICtrlListView_AddColumn( $hLV, "Items1",  100 )
  _GUICtrlListView_AddColumn( $hLV, "Items2",  100 )
  _GUICtrlListView_AddColumn( $hLV, "Items3",  100 )

  ; Handle $WM_NOTIFY messages from ListView
  ; Necessary to display the rows in a virtual ListView
  GUIRegisterMsg( $WM_NOTIFY, "WM_NOTIFY" )


  ; Display items
  GUICtrlSendMsg( $idLV, $LVM_SETITEMCOUNT, $iItems, 0 )

GUISetState(@SW_SHOW)

  ; Message loop
  While 1
    Switch GUIGetMsg()
     Case $GUI_EVENT_CLOSE
        Exit
		Case $Button1
			 $hLV = GUICtrlGetHandle( $idLV )
			  $IndexListView=_GUICtrlListView_GetSelectedIndices($idLV)   	; Индекс выделенной записи
			  $Name=_GUICtrlListView_GetItemText($hLV,$IndexListView,0)	; Название
			 MsgBox(0,'',$Name)
    EndSwitch
  WEnd

EndFunc



Func WM_NOTIFY( $hWnd, $iMsg, $wParam, $lParam )
  Local Static $tText = DllStructCreate( "wchar[50]" )
  Local Static $pText = DllStructGetPtr( $tText )

  Local $tNMHDR, $hWndFrom, $iCode
  $tNMHDR = DllStructCreate( $tagNMHDR, $lParam )
  $hWndFrom = HWnd( DllStructGetData( $tNMHDR, "hWndFrom" ) )
  $iCode = DllStructGetData( $tNMHDR, "Code" )

  Switch $hWndFrom
    Case $hLV
      Switch $iCode
        Case $LVN_GETDISPINFOW
          Local $tNMLVDISPINFO = DllStructCreate( $tagNMLVDISPINFO, $lParam )
		  $ColumnNumb=DllStructGetData( $tNMLVDISPINFO, "SubItem" ) ; Номер столбца, для которого ведется опрос
          If BitAND( DllStructGetData( $tNMLVDISPINFO, "Mask" ), $LVIF_TEXT ) Then
             Local $sItem = $aItems[DllStructGetData($tNMLVDISPINFO,"Item")][$ColumnNumb]
            DllStructSetData( $tText, 1, $sItem )
            DllStructSetData( $tNMLVDISPINFO, "Text", $pText )
            DllStructSetData( $tNMLVDISPINFO, "TextMax", StringLen( $sItem ) )
		  EndIf

		Case $NM_CUSTOMDRAW
                    Local $tNMLVCD = DllStructCreate($tagNMLVCUSTOMDRAW, $lParam)
                    Local $iDrawStage = DllStructGetData($tNMLVCD, 'dwDrawStage')
                    Local $iItem = DllStructGetData($tNMLVCD, 'dwItemSpec')			; индекс элемента
                    Local $iSubItem = DllStructGetData($tNMLVCD, 'iSubItem')		; индекс субэлемента
                    Switch $iDrawStage
                        Case $CDDS_PREPAINT
                            Return $CDRF_NOTIFYITEMDRAW
                        Case $CDDS_ITEMPREPAINT
                            Return $CDRF_NOTIFYSUBITEMDRAW
                        Case BitOR($CDDS_ITEMPREPAINT, $CDDS_SUBITEM)
                            Switch $aItems [$iItem][$iSubItem]
                                Case 'СтрокаI 3','СтрокаI 5'
                                    DllStructSetData($tNMLVCD, 'clrText', 0x0000FF) ; clrText, clrTextBk
                                Case Else
                                    DllStructSetData($tNMLVCD, 'clrText', 0x000000) ; 0xFFFFFF
							EndSwitch
                            Return $CDRF_NEWFONT
                    EndSwitch


      EndSwitch
 EndSwitch
  Return $GUI_RUNDEFMSG
EndFunc
 
Верх