Что нового

Цвет строки (item) в _GUICtrlListView_Create

The Dream

Новичок
Сообщения
393
Репутация
3
Не подскажите , можно ли сделать ф-цию,которая задавала бы цвет шрифта или хотя бы строчки в _GUICtrlListView_Create, на основе этого примера ?



Код:
#include <GuiConstantsEx.au3>
#include <WindowsConstants.au3>
#include <GuiListView.au3>
#include <FontConstants.au3>
#include <WinAPI.au3>

Global $Font1 = _WinAPI_CreateFont(14, 6, 0, 0, $FW_BOLD)
Global $Font2 = _WinAPI_CreateFont(14, 6, 0, 0, $FW_BOLD, True)

$hGUI = GUICreate("Test", 300, 200)

$hListView = _GUICtrlListView_Create($hGUI, "Items|SubItems", 10, 10, 280, 180, $LVS_REPORT, $WS_EX_CLIENTEDGE)

_GUICtrlListView_SetExtendedListViewStyle($hListView, BitOR($LVS_EX_GRIDLINES, $LVS_EX_FULLROWSELECT))

For $i = 1 To 10
    _GUICtrlListView_AddItem($hListView, "Item" & $i)
    _GUICtrlListView_AddSubItem($hListView, $i - 1, "SubItem" & $i, 1)
Next

GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY")

GUISetState()

Do
Until GUIGetMsg() = $GUI_EVENT_CLOSE

_WinAPI_DeleteObject($Font1)
_WinAPI_DeleteObject($Font2)

Func WM_NOTIFY($hWnd, $Msg, $wParam, $lParam)
    Local $tNMHDR, $hWndFrom, $iCode

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

    Switch $hWndFrom
        Case $hListView
            Switch $iCode
                Case $NM_CUSTOMDRAW
                    Local $tCustDraw = DllStructCreate($tagNMLVCUSTOMDRAW, $lParam)

                    Local $iDrawStage = DllStructGetData($tCustDraw, "dwDrawStage")

                    If $iDrawStage = $CDDS_PREPAINT Then Return $CDRF_NOTIFYITEMDRAW
                    If $iDrawStage = $CDDS_ITEMPREPAINT Then Return $CDRF_NOTIFYSUBITEMDRAW

                    Local $iSubItem = DllStructGetData($tCustDraw, "iSubItem")

                    Local $iItem = DllStructGetData($tCustDraw, "dwItemSpec")

                    Local $iColor, $hDC

                    Switch $iItem
                        Case 5
                            $hDC = DllStructGetData($tCustDraw, "hdc")

                            If $iSubItem = 0 Then
                                $iColor = 0xFF4466
                                _WinAPI_SelectObject($hDC, $Font1)
                            Else
                                $iColor = 0x5555DD
                                _WinAPI_SelectObject($hDC, $Font2)
                            EndIf

                            DllStructSetData($tCustDraw, "clrText", $iColor)

                            Return $CDRF_NEWFONT
                    EndSwitch
            EndSwitch
    EndSwitch

    Return $GUI_RUNDEFMSG
EndFunc
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Код:
#Include <GUIConstantsEx.au3>
#Include <GUIListView.au3>
#Include <WindowsConstants.au3>

Global $hGUI, $hListView

$hGUI = GUICreate('Test', 300, 200)
$hListView = _GUICtrlListView_Create($hGUI, 'Items|SubItems', 10, 10, 280, 180, $LVS_REPORT, $WS_EX_CLIENTEDGE)
_GUICtrlListView_SetExtendedListViewStyle($hListView, BitOR($LVS_EX_DOUBLEBUFFER, $LVS_EX_GRIDLINES, $LVS_EX_FULLROWSELECT, $WS_EX_CLIENTEDGE))
For $i = 0 To 9
	_GUICtrlListView_AddItem($hListView, 'Item' & $i)
	_GUICtrlListView_AddSubItem($hListView, $i, 'SubItem' & $i, 1)
	If Mod($i, 2) Then
		_GUICtrlListView_SetItemColor($hListView, $i, 0xFF8800, 0)
	Else
		_GUICtrlListView_SetItemColor($hListView, $i, 0x0000C0, 0)
	EndIf
Next
GUIRegisterMsg($WM_NOTIFY, 'WM_NOTIFY')
GUISetState()

Do
Until GUIGetMsg() = $GUI_EVENT_CLOSE

Func _GUICtrlListView_SetItemColor($hWnd, $iItem, $iColor, $fRedraw = 0)
	If _WinAPI_InProcess($hWnd, $_lv_ghLastWnd) Then
		If _GUICtrlListView_SetItemParam($hWnd, $iItem, BitOR(BitAND($iColor, 0x00FF00), BitShift(BitAND($iColor, 0x0000FF), -16), BitShift(BitAND($iColor, 0xFF0000), 16))) Then
			If $fRedraw Then
				_GUICtrlListView_RedrawItems($hWnd, $iItem, $iItem)
			EndIf
			Return 1
		EndIf
	EndIf
	Return 0
EndFunc   ;==>_GUICtrlListView_SetItemColor

Func WM_NOTIFY($hWnd, $iMsg, $wParam, $lParam)

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

	Switch $hWndFrom
		Case $hListView
			Switch $iCode
				Case $NM_CUSTOMDRAW

					Local $tNMLVCD = DllStructCreate($tagNMLVCUSTOMDRAW, $lParam)
					Local $iDrawStage = DllStructGetData($tNMLVCD, 'dwDrawStage')

					Switch $iDrawStage
						Case $CDDS_PREPAINT
							Return $CDRF_NOTIFYITEMDRAW
						Case $CDDS_ITEMPREPAINT
							Return $CDRF_NOTIFYSUBITEMDRAW
						Case BitOR($CDDS_ITEMPREPAINT, $CDDS_SUBITEM)
							DllStructSetData($tNMLVCD, 'clrText', _GUICtrlListView_GetItemParam($hWndFrom, DllStructGetData($tNMLVCD, 'dwItemSpec')))
							Return $CDRF_NEWFONT
					EndSwitch
			EndSwitch
	EndSwitch
	Return $GUI_RUNDEFMSG
EndFunc   ;==>WM_NOTIFY
 
Автор
T

The Dream

Новичок
Сообщения
393
Репутация
3
Большое спасибо!!!!! Год искал решение !!!!!


Добавлено:
Сообщение автоматически объединено:

А цвет самой строки - нельзя ? Просто пишу программу,и переделывать уже - поздно.А там нужно (желательно),чтобы я смог выделять строку,слово конкретное,всю строчку (не шрифт).

Хотя смотря на Ваш код,я не уверен что получится реализовать остальное вышенаписанное.Не могли бы вы чучуть прокоментировать код Ваш...))))
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Каждому элементу списка можно присвоить любое значение типа DWORD_PTR (см. функции _GUICtrlListView_SetItemParam() и _GUICtrlListView_GetItemParam()). В данном случае я использую эту возможность для хранения в этом параметре цвета текста (в RGB). Естественно, там можно хранить и цвет фона. Но если нужно использовать и то, и другое, то нужно завести 2D массив, и хранить в нем цвет как для текста, так и для фона, да и вообще все, что угодно. А в дополнительный параметр элементов записывать только индекс в этом массиве.

Если нужно только цвет фона, то вышеприведенный пример можно легко переписать для этой цели, заменив всего лишь пару строк.

Код:
#Include <GUIConstantsEx.au3>
#Include <GUIListView.au3>
#Include <WindowsConstants.au3>

Global $hGUI, $hListView

$hGUI = GUICreate('Test', 300, 200)
$hListView = _GUICtrlListView_Create($hGUI, 'Items|SubItems', 10, 10, 280, 180, $LVS_REPORT, $WS_EX_CLIENTEDGE)
_GUICtrlListView_SetExtendedListViewStyle($hListView, BitOR($LVS_EX_DOUBLEBUFFER, $LVS_EX_GRIDLINES, $LVS_EX_FULLROWSELECT, $WS_EX_CLIENTEDGE))
For $i = 0 To 9
    _GUICtrlListView_AddItem($hListView, 'Item' & $i)
    _GUICtrlListView_AddSubItem($hListView, $i, 'SubItem' & $i, 1)
    If Mod($i, 2) Then
        _GUICtrlListView_SetItemBkColor($hListView, $i, 0xFFD0D0, 0)
    Else
        _GUICtrlListView_SetItemBkColor($hListView, $i, 0xFFFFFF, 0)
    EndIf
Next
GUIRegisterMsg($WM_NOTIFY, 'WM_NOTIFY')
GUISetState()

Do
Until GUIGetMsg() = $GUI_EVENT_CLOSE

Func _GUICtrlListView_SetItemBkColor($hWnd, $iItem, $iColor, $fRedraw = 0)
    If _WinAPI_InProcess($hWnd, $_lv_ghLastWnd) Then
        If _GUICtrlListView_SetItemParam($hWnd, $iItem, BitOR(BitAND($iColor, 0x00FF00), BitShift(BitAND($iColor, 0x0000FF), -16), BitShift(BitAND($iColor, 0xFF0000), 16))) Then
            If $fRedraw Then
                _GUICtrlListView_RedrawItems($hWnd, $iItem, $iItem)
            EndIf
            Return 1
        EndIf
    EndIf
    Return 0
EndFunc   ;==>_GUICtrlListView_SetItemBkColor

Func WM_NOTIFY($hWnd, $iMsg, $wParam, $lParam)

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

    Switch $hWndFrom
        Case $hListView
            Switch $iCode
                Case $NM_CUSTOMDRAW

                    Local $tNMLVCD = DllStructCreate($tagNMLVCUSTOMDRAW, $lParam)
                    Local $iDrawStage = DllStructGetData($tNMLVCD, 'dwDrawStage')

                    Switch $iDrawStage
                        Case $CDDS_PREPAINT
                            Return $CDRF_NOTIFYITEMDRAW
                        Case $CDDS_ITEMPREPAINT
                            Return $CDRF_NOTIFYSUBITEMDRAW
                        Case BitOR($CDDS_ITEMPREPAINT, $CDDS_SUBITEM)
                            DllStructSetData($tNMLVCD, 'clrTextBk', _GUICtrlListView_GetItemParam($hWndFrom, DllStructGetData($tNMLVCD, 'dwItemSpec')))
                            Return $CDRF_NEWFONT
                    EndSwitch
            EndSwitch
    EndSwitch
    Return $GUI_RUNDEFMSG
EndFunc   ;==>WM_NOTIFY
 
Автор
T

The Dream

Новичок
Сообщения
393
Репутация
3
Также можно и присвоить изначение ...слову? вернее тексту ? например во второй колонке,строчка номер три..

Тоесть грубо говоря,Цвет я присваиваю этим ?

Код:
If _GUICtrlListView_SetItemParam($hWnd, $iItem, BitOR(BitAND($iColor, 0x00FF00), BitShift(BitAND($iColor, 0x0000FF), -16), BitShift(BitAND($iColor, 0xFF0000), 16))) Then



Добавлено:
Сообщение автоматически объединено:

Мне просто нужно вот что.В listView есть слова 'error' , нужно их всех найти и выделить шрифт допустим зеленым,а саму область (по координатам,тоесть строчка ,но именно та,что содержит это слово,не вся) - красным фоном.Это возможно? или все эти колонки в стрчоке - это одна строка на самом деле?
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Код:
#Include <GUIConstantsEx.au3>
#Include <GUIListView.au3>
#Include <WindowsConstants.au3>

Global $hGUI, $hListView

$hGUI = GUICreate('Test', 300, 200)
$hListView = _GUICtrlListView_Create($hGUI, 'Items|SubItems', 10, 10, 280, 180, $LVS_REPORT, $WS_EX_CLIENTEDGE)
_GUICtrlListView_SetExtendedListViewStyle($hListView, BitOR($LVS_EX_DOUBLEBUFFER, $LVS_EX_GRIDLINES, $LVS_EX_FULLROWSELECT, $WS_EX_CLIENTEDGE))
For $i = 0 To 19
    _GUICtrlListView_AddItem($hListView, 'Item' & $i)
	If Random(0, 5, 1) = 1 Then
		_GUICtrlListView_AddSubItem($hListView, $i, 'Error', 1)
		_GUICtrlListView_SetItemBkColor($hListView, $i, 0x00FF00)
	Else
		_GUICtrlListView_AddSubItem($hListView, $i, 'SubItem' & $i, 1)
		_GUICtrlListView_SetItemBkColor($hListView, $i, 0xFFFFFF)
	EndIf
Next
GUIRegisterMsg($WM_NOTIFY, 'WM_NOTIFY')
GUISetState()

Do
Until GUIGetMsg() = $GUI_EVENT_CLOSE

Func _GUICtrlListView_SetItemBkColor($hWnd, $iItem, $iColor, $fRedraw = 0)
    If _WinAPI_InProcess($hWnd, $_lv_ghLastWnd) Then
        If _GUICtrlListView_SetItemParam($hWnd, $iItem, BitOR(BitAND($iColor, 0x00FF00), BitShift(BitAND($iColor, 0x0000FF), -16), BitShift(BitAND($iColor, 0xFF0000), 16))) Then
            If $fRedraw Then
                _GUICtrlListView_RedrawItems($hWnd, $iItem, $iItem)
            EndIf
            Return 1
        EndIf
    EndIf
    Return 0
EndFunc   ;==>_GUICtrlListView_SetItemBkColor

Func WM_NOTIFY($hWnd, $iMsg, $wParam, $lParam)

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

    Switch $hWndFrom
        Case $hListView
            Switch $iCode
                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)
							If _GUICtrlListView_GetItemText($hWndFrom, $iItem, $iSubItem) = 'Error' Then
								DllStructSetData($tNMLVCD, 'clrTextBk', 0x000FF)
							Else
								DllStructSetData($tNMLVCD, 'clrTextBk', _GUICtrlListView_GetItemParam($hWndFrom, $iItem))
							EndIf
                            Return $CDRF_NEWFONT
                    EndSwitch
            EndSwitch
    EndSwitch
    Return $GUI_RUNDEFMSG
EndFunc   ;==>WM_NOTIFY
 
Автор
T

The Dream

Новичок
Сообщения
393
Репутация
3
Спасибо большое,буду дома попробую.
 
Автор
T

The Dream

Новичок
Сообщения
393
Репутация
3
Yashied,прошу прощения,как работает скрипт - я в принципе понял.Но вот сделать отдельные ф-ции - не получается ...тоесть просто ф-ция для окраски строки и ф-ция для окраски "области" .

Я понял,что DllStructSetData($tNMLVCD, 'clrTextBk', 0x000FF) - этим мы вносим изменения,и меняем цвет.

Но как это сделать так , бы сказать (написать) - по-вызову... так как я не знаю где нужно будет делать метки цветные . Честное слово сидел,но так и не смог понять ...
 
Автор
T

The Dream

Новичок
Сообщения
393
Репутация
3
В общем немного разобрался...)))

Правда вопрос остался один,я его точно не реши...как тогда все эти ф-ции обьеденить ?????

Но главное,что немного понял.Эта ф-ция,она "ловит" события нашего окна.Но сейчас не об этом.

Пока что не понял,как работает выделение области в строчке (область того или иного столбика) ..

Требуется чтото на подобии этого :

Код:
_GUICtrlListView_SetItemColor($hWnd,'индекс строки','индекс "области" (это по-моему subItem)','тип - шрифт/фон' ,'цвет')



Но для меня трудное не так это как просто то,как обьеденить эти ф-ции! (что Вы писали выше),так как они работают на отлов события ..... :whistle:
 
Автор
T

The Dream

Новичок
Сообщения
393
Репутация
3
Элементу в списке не могу присвоить массив..

что делать..? :whistle:
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Элемент в списке - строка, и только. Какой может быть массив? И еще, универсальной функции написать нельзя, т.к. ListView и WM_NOTIFY есть одно целое. Нужно составить алгоритм для обработки WM_NOTIFY, исходя из четко поставленной задачи. А что бы это сделать, нужно иметь представление о том как все это работает. Начни с изучения NM_CUSTOMDRAW для ListView. Если не хочется, то воспользуйся готовым решением.
 
Автор
T

The Dream

Новичок
Сообщения
393
Репутация
3
а оно разве для
Код:
_GUICtrlListView_Create
?


Вроде бы на примере твоего последнего примера - можно сделать и то и то,просто это будет не правильно.Попробую,отпишусь..)


Добавлено:
Сообщение автоматически объединено:

прошу прощения,что Вас уже "достал" этим.Просто думал,это возможно,как бы по-факту то и возможно,но по отдельности.А жаль.
 
Автор
T

The Dream

Новичок
Сообщения
393
Репутация
3
Yashied , я по-моему нашел решение.Но перед этим,хочу спросить у тебя,нет ли тут подводных камней ..?

Получается так.Я изменяю переменную по-ходу скрипта,но предыдущее значение , я - записываю,чтобы не терять изменений "до" текущего.

Единственный , маленький вопрос - как установить авто-обновление? а то обновляется,только,если занести за область видимости экрана и обратно.Но как факт - работает.Там и фон можно я так понимаю и цвет шрифта ...

Пожалуйста,посмотри.. (это грубый пример,как показатель) :

Код:
#include <GUIConstantsEx.au3>
#include <GUIListView.au3>
#include <WindowsConstants.au3>

Global $hGUI, $hListView, $testParam = 'Error;Error2;Error2'

$hGUI = GUICreate('Test', 300, 200)
$hListView = _GUICtrlListView_Create($hGUI, 'Items|SubItems', 10, 10, 280, 180, $LVS_REPORT, $WS_EX_CLIENTEDGE)
_GUICtrlListView_SetExtendedListViewStyle($hListView, BitOR($LVS_EX_DOUBLEBUFFER, $LVS_EX_GRIDLINES, $LVS_EX_FULLROWSELECT, $WS_EX_CLIENTEDGE))
_GUICtrlListView_AddItem($hListView, 'Item')
_GUICtrlListView_AddSubItem($hListView, 0, 'Error', 1)
_GUICtrlListView_AddItem($hListView, 'Error2')
_GUICtrlListView_AddItem($hListView, 'Item')
_GUICtrlListView_AddItem($hListView, 'Item')
_GUICtrlListView_AddItem($hListView, 'Item666')

For $counter = 0 To _GUICtrlListView_GetItemCount($hListView) - 1
	_GUICtrlListView_SetItemBkColor($hListView, $counter, 0xFFFFFF)
Next

;~         _GUICtrlListView_SetItemBkColor($hListView, $i, 0x00FF00) ; цвет строки в которой есть слово error

GUIRegisterMsg($WM_NOTIFY, 'WM_NOTIFY')
GUISetState()



MsgBox(16,'','')

$testParam = 'Error;Error2;Item666'



Do
Until GUIGetMsg() = $GUI_EVENT_CLOSE

Func _GUICtrlListView_SetItemBkColor($hWnd, $iItem, $iColor, $fRedraw = 0)
	If _WinAPI_InProcess($hWnd, $_lv_ghLastWnd) Then
		If _GUICtrlListView_SetItemParam($hWnd, $iItem, BitOR(BitAND($iColor, 0x00FF00), BitShift(BitAND($iColor, 0x0000FF), -16), BitShift(BitAND($iColor, 0xFF0000), 16))) Then
			If $fRedraw Then
				_GUICtrlListView_RedrawItems($hWnd, $iItem, $iItem)
			EndIf
			Return 1
		EndIf
	EndIf
	Return 0
EndFunc   ;==>_GUICtrlListView_SetItemBkColor

Func WM_NOTIFY($hWnd, $iMsg, $wParam, $lParam)

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

	Switch $hWndFrom
		Case $hListView
			Switch $iCode
				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)

							If StringInStr($testParam, ';') Then
								$A = StringSplit($testParam, ';')
								If _GUICtrlListView_GetItemText($hWndFrom, $iItem, $iSubItem) = $A[1] Then
									DllStructSetData($tNMLVCD, 'clrTextBk', 0x000FF)
								Else
									DllStructSetData($tNMLVCD, 'clrTextBk', _GUICtrlListView_GetItemParam($hWndFrom, $iItem))
								EndIf

								If _GUICtrlListView_GetItemText($hWndFrom, $iItem, $iSubItem) = $A[2] Then
									DllStructSetData($tNMLVCD, 'clrTextBk', 0x000FF)
								Else
;~ 									DllStructSetData($tNMLVCD, 'clrTextBk', _GUICtrlListView_GetItemParam($hWndFrom, $iItem))
								EndIf

								If _GUICtrlListView_GetItemText($hWndFrom, $iItem, $iSubItem) = $A[3] Then
									DllStructSetData($tNMLVCD, 'clrTextBk', 0x000FF)
								Else
;~ 									DllStructSetData($tNMLVCD, 'clrTextBk', _GUICtrlListView_GetItemParam($hWndFrom, $iItem))
								EndIf

							EndIf

							Return $CDRF_NEWFONT
					EndSwitch
			EndSwitch
	EndSwitch
	Return $GUI_RUNDEFMSG
EndFunc   ;==>WM_NOTIFY
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
_GUICtrlListView_SetItemBkColor() тебе вообще здесь не нужна. Вот пример, как нужно работать с NM_CUSTOMDRAW для ListView.

Код:
#include <GUIConstantsEx.au3>
#include <GUIListView.au3>
#include <WindowsConstants.au3>

Global $hGUI, $hListView, $testParam = 'Error;Error2;Error2'

$hGUI = GUICreate('Test', 300, 200)
$hListView = _GUICtrlListView_Create($hGUI, 'Items|SubItems', 10, 10, 280, 180, $LVS_REPORT, $WS_EX_CLIENTEDGE)
_GUICtrlListView_SetExtendedListViewStyle($hListView, BitOR($LVS_EX_DOUBLEBUFFER, $LVS_EX_GRIDLINES, $LVS_EX_FULLROWSELECT, $WS_EX_CLIENTEDGE))

_GUICtrlListView_AddItem($hListView, 'Item')
_GUICtrlListView_AddSubItem($hListView, 0, 'Error', 1)
_GUICtrlListView_AddItem($hListView, 'Error2')
_GUICtrlListView_AddItem($hListView, 'Item')
_GUICtrlListView_AddItem($hListView, 'Item')
_GUICtrlListView_AddItem($hListView, 'Item666')

GUIRegisterMsg($WM_NOTIFY, 'WM_NOTIFY')
GUISetState()

Do
Until GUIGetMsg() = $GUI_EVENT_CLOSE

Func WM_NOTIFY($hWnd, $iMsg, $wParam, $lParam)

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

    Switch $hWndFrom
        Case $hListView
            Switch $iCode
                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)

							; Здесь у тебя есть индекс элемента ($iItem) и индекс его субэлемента ($iSubItem).
							; Проанализируй текст этой ячейки и установи соответствующий цвет текста и/или фона.
							; Цвет нужно устанавливать в любом случае!!!

							Switch _GUICtrlListView_GetItemText($hWndFrom, $iItem, $iSubItem)
								Case 'Error', 'Error2', 'Item666'
									DllStructSetData($tNMLVCD, 'clrTextBk', 0x0000FF)
								Case Else
									DllStructSetData($tNMLVCD, 'clrTextBk', 0xFFFFFF)
							EndSwitch
                            Return $CDRF_NEWFONT
                    EndSwitch
            EndSwitch
    EndSwitch
    Return $GUI_RUNDEFMSG
EndFunc   ;==>WM_NOTIFY
 
Автор
T

The Dream

Новичок
Сообщения
393
Репутация
3
нет,нет,нет,я пример давал к тому,что цвет я выставляю во время выполнения скрипта ! . Тоесть я ф-ции , вернее $testParam задаю содержимое ячейки и в итоге выделяю цветом.Я заранее не знаю,что я буду выделять..

В этой строчке,элементы заранее не известны."Error" был для примера.

Код:
Case 'Error', 'Error2', 'Item666'



А лучше я напишу,для чего мне это.Идет обработка операции и в случае успеха - выделяется к примеру зеленым "область" (не знаю как это называется) .В случае ошибки - красным. А ошибка или успех - я задаю,вернее скрипт во время работы сам анализирует.Ошибка -я посылаю содержимое и цвет.Так и с успехом.Тоесть , чтото в этом роде - посылаю строку 'getSubItemText//color' , а в wm_notify я анализирую - содержимое ячейки выделяю цветом ('color') . Тоесть передаю два параметра в переменной,вернее заношу в нее,но при этом сохраняю предыдущие,чтобы не терять остальное,"общую картину".
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
:blink:

Еще раз наморщи ум и посмотри пример. В функции WM_NOTIFY() ты можешь сделать ВСЕ, ЧТО УГОДНО! Проверяй переменные, текст элемента и т.д. Главное, занести какой-нибудь цвет в "clrTextBk". Так понятно?
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
OffTopic:
The Dream [?]
что цвет я выставляю во время выполнения скрипта
Вы хотите сказать:
Ячейки (item & subitem) должны окрашиваться динамически по результату значений в ячейках, в процессе выполнения скрипта. А то IMHO Yashied запутался ;D



Добавлено:
Сообщение автоматически объединено:

Yashied
Спасибо за пример! Я для себя нашёл интересный момент!
А то я с GUIRegisterMsg на вы :smile:
 
Автор
T

The Dream

Новичок
Сообщения
393
Репутация
3
Простите,может я глупый.

Все,понял.Теперь осталось только сохранять предыдущее значение и все.

Попробую,потом,покажу..,если никто не против)
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
А зачем сохранять? Вот еще вариант с массивом цветов:

Код:
#Include <GUIConstantsEx.au3>
#Include <GUIListView.au3>
#Include <WindowsConstants.au3>

Dim $ColorData[5][2][2]
For $i = 0 To UBound($ColorData) - 1
	For $j = 0 To UBound($ColorData, 2) - 1
		$ColorData[$i][$j][0] = 0
		$ColorData[$i][$j][1] = 0xFFFFFF
	Next
Next

$hGUI = GUICreate('Test', 300, 200)
$hListView = _GUICtrlListView_Create($hGUI, 'Items|SubItems', 10, 10, 280, 180, $LVS_REPORT, $WS_EX_CLIENTEDGE)
_GUICtrlListView_SetExtendedListViewStyle($hListView, BitOR($LVS_EX_DOUBLEBUFFER, $LVS_EX_GRIDLINES, $LVS_EX_FULLROWSELECT, $WS_EX_CLIENTEDGE))

_GUICtrlListView_AddItem($hListView, 'Item')
_SetItemColors($hListView, 0, 0, 0)
_GUICtrlListView_AddSubItem($hListView, 0, 'Error', 1)
_SetItemColors($hListView, 0, 1, 0, 0x0000FF)
_GUICtrlListView_AddItem($hListView, 'Error2')
_SetItemColors($hListView, 1, 0, 0, 0x0000FF)
_GUICtrlListView_AddItem($hListView, 'Item')
_SetItemColors($hListView, 2, 0, 0, 0xFFFFFF)
_GUICtrlListView_AddItem($hListView, 'Item')
_SetItemColors($hListView, 3, 0, 0, 0xFFFFFF)
_GUICtrlListView_AddItem($hListView, 'Item666')
_SetItemColors($hListView, 4, 0, 0, 0x0000FF)

GUIRegisterMsg($WM_NOTIFY, 'WM_NOTIFY')
GUISetState()

Do
Until GUIGetMsg() = $GUI_EVENT_CLOSE

Func _SetItemColors($hWnd, $iItem, $iSubItem, $iColor, $iBkColor = 0xFFFFFF, $fRedraw = False)
	If ($iItem < 0) Or ($iItem > UBound($ColorData) - 1) Then
		Return 0
	EndIf
	If ($iSubItem < 0) Or ($iSubItem > UBound($ColorData, 2) - 1) Then
		Return 0
	EndIf
	$ColorData[$iItem][$iSubItem][0] = $iColor
	$ColorData[$iItem][$iSubItem][1] = $iBkColor
	If $fRedraw Then
		_GUICtrlListView_RedrawItems($hWnd, $iItem, $iItem)
	EndIf
	Return 1
EndFunc   ;==>_SetItemColors

Func WM_NOTIFY($hWnd, $iMsg, $wParam, $lParam)

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

    Switch $hWndFrom
        Case $hListView
            Switch $iCode
                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)
							DllStructSetData($tNMLVCD, 'clrTextBk', $ColorData[$iItem][$iSubItem][1])
							DllStructSetData($tNMLVCD, 'clrText', $ColorData[$iItem][$iSubItem][0])
                            Return $CDRF_NEWFONT
                    EndSwitch
            EndSwitch
    EndSwitch
    Return $GUI_RUNDEFMSG
EndFunc   ;==>WM_NOTIFY
 
Автор
T

The Dream

Новичок
Сообщения
393
Репутация
3
Если я даю другое значение,например 'error1', то 'error' у меня теряло значение (тоесть цвет)


за ф-цию , большое спасибо,правда я вряд ли сейчас понимаю,как она работает..

То,что я думал сделать,работало бы также,но как я уже писал пару сообщений раньше - не так,как бы ..."положено" , или вернее "правильно".
 
Верх