Что нового

[Элементы GUI] Как изменить цвет текста только одной строки в ListView

pvnn

Осваивающий
Сообщения
305
Репутация
32
Необходимо изменить цвет шрифта конкретной строки в элементе ListView

_GUICtrlListView_SetTextColor () изменяет цвет шрифта во всем ListView, а мне нужно только одной строки. Вот пример:

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

#Include <GuiListView.au3>

$Form1 = GUICreate("Form1", 477, 131, 258, 187)
$hListView = _GUICtrlListView_Create($Form1,"", 24, 16, 433, 97)
    _GUICtrlListView_SetExtendedListViewStyle($hListView, BitOR($LVS_EX_GRIDLINES, $LVS_EX_FULLROWSELECT, $LVS_EX_SUBITEMIMAGES, $LVS_EX_CHECKBOXES))
    _GUICtrlListView_InsertColumn($hListView, 0, "Колонка 1:", 100)
	_GUICtrlListView_InsertColumn($hListView, 1, "Колонка 2:", 100)
    _GUICtrlListView_AddItem($hListView, 'A')
    _GUICtrlListView_AddSubItem($hListView, 0, 'A', 1)
    _GUICtrlListView_AddItem($hListView, 'B')
    _GUICtrlListView_AddSubItem($hListView, 1, 'B', 1)
    _GUICtrlListView_AddItem($hListView, 'A')
    _GUICtrlListView_AddSubItem($hListView, 2, 'A', 1)

GUISetState(@SW_SHOW)

While 1
	$nMsg = GUIGetMsg()
	Switch $nMsg
		Case $GUI_EVENT_CLOSE
			Exit

	EndSwitch
WEnd


Мне необходимо, чтобы строка с данными "B" была выделена например зеленым цветом
Как это можно сделать?
 
Автор
P

pvnn

Осваивающий
Сообщения
305
Репутация
32
madmasles сказал(а):
pvnn
Здесь: LV_Format_include.au3 то, что Вам надо.

Спасибо конечно, но мне не очень хочется так делать. Мне не обязательно выделять строки в колонках разным цветом, мне нужно выделить цветом строку целиком.
Конечно, можно и данным методом, но может есть что по-проще?
 

gregaz

AutoIT Гуру
Сообщения
1,166
Репутация
299
pvnn [?]
Мне необходимо, чтобы строка с данными "B" была выделена например зеленым цветом
Как это можно сделать?
Как вариант : Не использовать UDF при создании ListView
Код:
#include <GUIConstantsEx.au3>
#include <GUIListBox.au3>
#include <WindowsConstants.au3>

#Include <GuiListView.au3>

	$Form1 = GUICreate("Form1", 477, 131, 258, 187)
	;$hListView = _GUICtrlListView_Create($Form1,"", 24, 16, 433, 97)
$hListView =  GUICtrlCreateListView ("", 24, 16, 433, 97) 
_GUICtrlListView_SetExtendedListViewStyle($hListView, BitOR($LVS_EX_GRIDLINES, $LVS_EX_FULLROWSELECT, $LVS_EX_SUBITEMIMAGES, $LVS_EX_CHECKBOXES))
    _GUICtrlListView_InsertColumn($hListView, 0, "Колонка 1:", 100)
    _GUICtrlListView_InsertColumn($hListView, 1, "Колонка 2:", 100)
    ;_GUICtrlListView_AddItem($hListView, 'A')
GUICtrlCreateListViewItem('A' , $hListView)
	_GUICtrlListView_AddSubItem($hListView, 0, 'A', 1)
	;_GUICtrlListView_AddItem($hListView, 'B')
GUICtrlCreateListViewItem('B' , $hListView)
GUICtrlSetColor( -1, 0x00FF00)
	_GUICtrlListView_AddSubItem($hListView, 1, 'B', 1)
   ; _GUICtrlListView_AddItem($hListView, 'A')
GUICtrlCreateListViewItem('A' , $hListView)
GUICtrlSetColor( -1, 0xFF0000)  
  _GUICtrlListView_AddSubItem($hListView, 2, 'A', 1)

GUISetState(@SW_SHOW)

While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
        Case $GUI_EVENT_CLOSE
            Exit

    EndSwitch
WEnd

pvnn [?]
Мне не обязательно выделять строки в колонках разным цветом, мне нужно выделить цветом строку целиком.
Конечно, можно и данным методом, но может есть что по-проще?
Это наверное и есть самое простое решение
 
  • Like
Реакции: Norm
Автор
P

pvnn

Осваивающий
Сообщения
305
Репутация
32
Почти решена тема, только...
Как отследить нужную строку с данными
Вот тот же пример, но цвет строки нужно изменить только после нажатия на кнопку.
Индекс строки я нашел, а получить controlID не получается, _GUICtrlListView_MapIndexToID не работает




Код:
#include <ButtonConstants.au3>
#include <GUIConstantsEx.au3>
#include <ListViewConstants.au3>
#include <WindowsConstants.au3>
#Include <GuiListView.au3>

    $Form1 = GUICreate("Form1", 484, 192, 258, 187)
    ;$hListView = _GUICtrlListView_Create($Form1,"", 24, 16, 433, 97)
$hListView =  GUICtrlCreateListView ("", 24, 16, 433, 97)
_GUICtrlListView_SetExtendedListViewStyle($hListView, BitOR($LVS_EX_GRIDLINES, $LVS_EX_FULLROWSELECT, $LVS_EX_SUBITEMIMAGES, $LVS_EX_CHECKBOXES))
    _GUICtrlListView_InsertColumn($hListView, 0, "Колонка 1:", 100)
    _GUICtrlListView_InsertColumn($hListView, 1, "Колонка 2:", 100)
    ;_GUICtrlListView_AddItem($hListView, 'A')
$Button1 = GUICtrlCreateButton("Button1", 368, 152, 75, 25, $WS_GROUP)
GUICtrlCreateListViewItem('A' , $hListView)
    _GUICtrlListView_AddSubItem($hListView, 0, 'A', 1)
    ;_GUICtrlListView_AddItem($hListView, 'B')
GUICtrlCreateListViewItem('B' , $hListView)
GUICtrlSetColor( -1, 0x00FF00)
    _GUICtrlListView_AddSubItem($hListView, 1, 'B', 1)
   ; _GUICtrlListView_AddItem($hListView, 'A')
GUICtrlCreateListViewItem('A' , $hListView)
GUICtrlSetColor( -1, 0xFF0000)
  _GUICtrlListView_AddSubItem($hListView, 2, 'A', 1)

GUISetState(@SW_SHOW)

While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
		Case $GUI_EVENT_CLOSE

            Exit
		Case $Button1
			$index=_GUICtrlListView_FindInText($hListView, 'B',  -1)
			$ID=_GUICtrlListView_MapIndexToID($hListView, $index) ; Данная строка не работает
			GUICtrlSetColor( $ID, 0x3900b5)
    EndSwitch
WEnd
 

gregaz

AutoIT Гуру
Сообщения
1,166
Репутация
299
pvnn [?]
Индекс строки я нашел, а получить controlID не получается, _GUICtrlListView_MapIndexToID не работает

controlID можно получить с помощью ф-ии : GUICtrlRead($hListView) ,предварительно отметив строку выделенной

Можно так :
Код:
#include <GUIConstantsEx.au3>
#Include <GuiListView.au3>

$Form1 = GUICreate("Form1", 484, 192, 258, 187)
$hListView =  GUICtrlCreateListView ("Колонка 1:|Колонка 2:", 24, 16, 433, 97)
_GUICtrlListView_SetExtendedListViewStyle($hListView, BitOR($LVS_EX_GRIDLINES, $LVS_EX_FULLROWSELECT, $LVS_EX_SUBITEMIMAGES, $LVS_EX_CHECKBOXES))
GUICtrlCreateListViewItem('A' , $hListView)
_GUICtrlListView_AddSubItem($hListView, 0, 'A', 1)
GUICtrlCreateListViewItem('B' , $hListView)
_GUICtrlListView_AddSubItem($hListView, 1, 'B', 1)
GUICtrlCreateListViewItem('C' , $hListView)
_GUICtrlListView_AddSubItem($hListView, 2, 'C', 1)
$btA = GUICtrlCreateButton("A", 100, 152, 75, 25)
$btB = GUICtrlCreateButton("B", 200, 152, 75, 25)
$btC = GUICtrlCreateButton("C", 300, 152, 75, 25)
GUISetState(@SW_SHOW)

While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
        Case $GUI_EVENT_CLOSE
            Exit
        Case $btA
            $iIndex=_GUICtrlListView_FindInText($hListView, 'A')
			$Color="0x00FF00"
		Case $btB
            $iIndex=_GUICtrlListView_FindInText($hListView, 'B')
			$Color="0xFF0000"
		Case $btC
            $iIndex=_GUICtrlListView_FindInText($hListView, 'C')
			$Color="0x0000FF"
			
		Case Else
			ContinueLoop
	EndSwitch
	_GUICtrlListView_SetItemSelected($hListView, $iIndex)
	$ID=GUICtrlRead($hListView)
	_GUICtrlListView_SetItemSelected($hListView, $iIndex,False)
	GUICtrlSetColor( $ID, $Color)
WEnd
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
pvnn [?]
_GUICtrlListView_MapIndexToID не работает
Она работает с элементами созданными не нативными функциями. Для получения ID в этом случае можно сделать так:

Код:
#include <ButtonConstants.au3>
#include <GUIConstantsEx.au3>
#include <ListViewConstants.au3>
#include <WindowsConstants.au3>
#Include <GuiListView.au3>

Global $aItem[4] = [3]

$Form1 = GUICreate("Form1", 484, 192, 258, 187)

$hListView =  GUICtrlCreateListView("", 24, 16, 433, 97)
_GUICtrlListView_SetExtendedListViewStyle($hListView, BitOR($LVS_EX_GRIDLINES, $LVS_EX_FULLROWSELECT, $LVS_EX_SUBITEMIMAGES, $LVS_EX_CHECKBOXES))
_GUICtrlListView_InsertColumn($hListView, 0, "Колонка 1:", 100)
_GUICtrlListView_InsertColumn($hListView, 1, "Колонка 2:", 100)

$Button1 = GUICtrlCreateButton("Button1", 368, 152, 75, 25, $WS_GROUP)

$aItem[1] = GUICtrlCreateListViewItem('A|A' , $hListView)
$aItem[2] = GUICtrlCreateListViewItem('B|B' , $hListView)
GUICtrlSetColor( -1, 0x00FF00)
$aItem[3] = GUICtrlCreateListViewItem('C|C' , $hListView)
GUICtrlSetColor( -1, 0xFF0000)

GUISetState(@SW_SHOW)

While 1
    $nMsg = GUIGetMsg()
	
    Switch $nMsg
        Case $GUI_EVENT_CLOSE
            Exit
        Case $Button1
            $iIndex = _GUICtrlListView_FindInText($hListView, 'B')
			
			If $iIndex > -1 And $iIndex < $aItem[0] Then
				$ID = $aItem[$iIndex+1]
				GUICtrlSetColor($ID, 0x3900b5)
			EndIf
    EndSwitch
WEnd
 
Автор
P

pvnn

Осваивающий
Сообщения
305
Репутация
32
CreatoR как раз то, что надо!
Спасибо!

Спасибо всем за помощь!!!
 

gregaz

AutoIT Гуру
Сообщения
1,166
Репутация
299
Еще один простой вариант :
Код:
#include <GUIConstantsEx.au3>
#Include <GuiListView.au3>

$Form1 = GUICreate("Form1", 484, 192, 258, 187)
$hListView =  GUICtrlCreateListView ("Колонка 1:|Колонка 2:", 24, 16, 433, 97)
_GUICtrlListView_SetExtendedListViewStyle($hListView, BitOR($LVS_EX_GRIDLINES, $LVS_EX_FULLROWSELECT, $LVS_EX_SUBITEMIMAGES, $LVS_EX_CHECKBOXES))
GUICtrlCreateListViewItem('A|A' , $hListView)
GUICtrlCreateListViewItem('B|B' , $hListView)
GUICtrlCreateListViewItem('C|C' , $hListView)

$btB = GUICtrlCreateButton("B", 200, 152, 75, 25)

GUISetState(@SW_SHOW)

While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
        Case $GUI_EVENT_CLOSE
            Exit
		Case $btB
            $iIndex=_GUICtrlListView_FindInText($hListView, 'B')
			$aParametr=_GUICtrlListView_GetItem($hListView, $iIndex)
			$ID=$aParametr[5]
			GUICtrlSetColor( $ID,0x00FF00)
	EndSwitch
WEnd
 

The Dream

Новичок
Сообщения
393
Репутация
3
А для
Код:
_GUICtrlListView_Create
, если созданно с помощью это ф-ции - то цвет listView , строки - изменить так и нельзя,верно?
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
CreatoR сказал(а):
Для получения ID в этом случае можно сделать так...

Элементы в ListView или TreeView не являются Control'ами. Это что-то вроде текста в Edit. Следовательно, они не имеют никаких Handle и ID. То, что возвращает функция GUICtrlCreateListViewItem() или GUICtrlCreateTreeViewItem(), это маленькая хитрость AutoIt, которая многих сбивает с толку. Для них даже GUICtrlGetHandle() не будет работать. ID, возвращаемые этими функциями, являются просто порядковыми номерами для элементов ListView и TreeView, по которым AutoIt их идентифицирует. А чтобы AutoIt мог как-то связать эти номера непосредственно с элементами в ListView и TreeView, он задействует дополнительный параметр этих элементов (Application specified value), который есть у всех элементов ComboBox, ListBox, ListView, TreeView и т.д., это их свойство. Таким образом, чтобы определить псевдо ID элемента, назначенное ему при создании, AutoIt просто считывает значение дополнительного параметра у этого элемента, которое сам же ему и присвоил, при вызове функции GUICtrlCreateListViewItem() или GUICtrlCreateTreeViewItem(). Это значение и есть ID элемента, его же и возвращают GUICtrlCreateListViewItem() и GUICtrlCreateTreeViewItem(). Короче говоря, чтобы узнать ID элемента ListView или TreeView, можно просто-напросто воспользоваться функцией _GUICtrlListView_GetItemParam() или _GUICtrlTreeView_GetItemParam() соответственно. В принципе, gregaz уже ответил на это.

Теперь о грустном. Такой подход со стороны AutoIt накладывает некоторые ограничения в работе с ListView и TreeView. Во-первых, если для создания элементов вы использовали нативные функции - GUICtrlCreateListViewItem() или GUICtrlCreateTreeViewItem(), то ни в коем случае нельзя изменять значения дополнительных параметров у этих элементов, т.е. использовать _GUICtrl*_SetItemParam(), иначе глюки будут страшные. Во-вторых, если для создания элементов вы использовали API функции - _GUICtrlListView_Add*() или _GUICtrlTreeView_Add*(), то использовать _GUICtrl*_SetItemParam() тоже не стоит, т.к. глюки могут быть еще страшней. И в-третьих, т.к. псевдо ID элементов ListView и TreeView приравниваются к ID остальных Control'ов (Button, Label и т.д.), а общее количество Control'ов в GUI ограничено, согласно справке, 65533 штуками, то, например, количество элементов в ListView не может превышать 65532 (+1 на сам ListView). И это при условии, что кроме ListView на форме больше ничего нет!

Код:
#Include <GUIListView.au3>

GUICreate('')
$LV =  GUICtrlCreateListView('', 0, 0)
For $i = 1 To 65532
	GUICtrlCreateListViewItem($i, $LV)
Next
ConsoleWrite(_GUICtrlListView_GetItemCount($LV) & @CR)
$Button = GUICtrlCreateButton('OK', 0, 0)
ConsoleWrite($Button & @CR)


Пример создания элементов с помощью API:

Код:
#Include <GUIListView.au3>

GUICreate('')
$hLV =  GUICtrlGetHandle(GUICtrlCreateListView('', 0, 0))
For $i = 1 To 100000
	_GUICtrlListView_AddItem($hLV, $i)
Next
ConsoleWrite(_GUICtrlListView_GetItemCount($hLV) & @CR)
$Button = GUICtrlCreateButton('OK', 0, 0)
ConsoleWrite($Button & @CR)


Выводы, каким способом лучше пользоваться, делайте сами. Лично я, для создания ListView использую AutoIt, а для добавления в него элементов - API. Но простым способом раскрасить элементы здесь уже не получиться.



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

The Dream сказал(а):
А для
Код:
_GUICtrlListView_Create
, если созданно с помощью это ф-ции - то цвет listView , строки - изменить так и нельзя,верно?

Можно, см. выше.
 
  • Like
Реакции: Norm

XpycT

Скриптер
Сообщения
380
Репутация
133
Вот еще один вариант раскраски текста
Код:
#Region Includes
#include <GUIConstantsEx.au3>
#include <GuiListView.au3>
#include <WindowsConstants.au3>
#EndRegion Includes
#NoTrayIcon

Dim $aData[10][3]
For $i = 0 To 9
	$aData[$i][0] = 'Row ' & StringFormat('%02d', $i)
	$aData[$i][1] = Random(1, 100, 1)
Next

$hMainGui = GUICreate('Demo', 400, 300)

$ListView = GUICtrlCreateListView("", 5, 5, 490, 290)
_GUICtrlListView_SetExtendedListViewStyle($ListView, BitOR($LVS_EX_DOUBLEBUFFER, $LVS_EX_GRIDLINES, $LVS_EX_FULLROWSELECT))

_GUICtrlListView_InsertColumn($ListView, 0, "Col 1", 100, 2)
_GUICtrlListView_InsertColumn($ListView, 1, "Col 2", 100, 2)

For $i = 0 To 9
	$iCol = _GUICtrlListView_InsertItem($ListView, $aData[$i][0])
	_GUICtrlListView_SetItemText($ListView, $iCol, $aData[$i][1], 1)
Next

GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY")
GUISetState()

While 1
	Switch GUIGetMsg()
		Case $GUI_EVENT_CLOSE
			Exit
	EndSwitch
WEnd

Func _SetColorMarker($_tCustDraw, $_iItem)
	$sCellText = _GUICtrlListView_GetItemText($ListView, $_iItem, 1)

	If $sCellText > 50 Then
		DllStructSetData($_tCustDraw, 'clrTextBk', _Color_Convert_RGB2BGR(0xFFFFFF)) ; Text Backgroudn Color White
		DllStructSetData($_tCustDraw, 'clrText', _Color_Convert_RGB2BGR(0x0000FF)) ; Text Color Blue
	Else
		DllStructSetData($_tCustDraw, 'clrTextBk', _Color_Convert_RGB2BGR(0xFFFFFF)) ; Text Backgroudn Color White
		DllStructSetData($_tCustDraw, 'clrText', _Color_Convert_RGB2BGR(0xFF0000)) ; Text Color Red
	EndIf
EndFunc

Func _Color_Convert_RGB2BGR($_iColor)
	Return BitAND(BitShift(String(Binary($_iColor)), 8), 0xFFFFFF)
EndFunc   ;==>_Color_Convert_RGB2BGR

Func WM_NOTIFY($hWnd, $iMsg, $iwParam, $ilParam)
	Local $hWndFrom, $iCode, $tNMHDR, $tInfo

	Local $hListView = $ListView
	If Not IsHWnd($hListView) Then $hListView = GUICtrlGetHandle($hListView)

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

	If $hWndFrom = $hListView And $iCode = $NM_CUSTOMDRAW Then
		If Not _GUICtrlListView_GetViewDetails($hWndFrom) Then Return $GUI_RUNDEFMSG

		Local $iDrawStage, $iItem, $iSubitem
		Local $tCustDraw = DllStructCreate('hwnd hwndFrom;int idFrom;int code;dword DrawStage;hwnd hdc;long rect[4];dword ItemSpec;' & _
																			 'int ItemState;dword Itemlparam;dword clrText;dword clrTextBk;int SubItem;dword ItemType;' & _
																			 'dword clrFace;int IconEffect;int IconPhase;int PartID;int StateID;long rectText[4];int Align', $ilParam)

		$iDrawStage = DllStructGetData($tCustDraw, "DrawStage")
		If $iDrawStage = $CDDS_PREPAINT Then Return $CDRF_NOTIFYITEMDRAW
		If $iDrawStage = $CDDS_ITEMPREPAINT Then Return $CDRF_NOTIFYSUBITEMDRAW ; request drawing each cell separately

		$iItem    = DllStructGetData($tCustDraw, "ItemSpec")
		$iSubitem = DllStructGetData($tCustDraw, "SubItem")

		If $iItem > _GUICtrlListView_GetItemCount($hWndFrom) Then Return 0
		If $iSubitem > _GUICtrlListView_GetColumnCount($hWndFrom) Then Return 0

		_SetColorMarker($tCustDraw, $iItem)
	EndIf

	Return $GUI_RUNDEFMSG
EndFunc   ;==>WM_NOTIFY
 
Верх