请教ListView颜色变更的方式
我也不知道要如何形容,在坛子里找寻相关的实例,并没有找见如何更改列标题区域背景颜色的方法只发现了一个案例:
地址:https://www.autoitx.com/forum.php?mod=viewthread&tid=30739&page=1#pid405863
我依据上面的代码片段修改了之后,显示出来的状态是这样子的。。。。
列表标题区变成了立体的感觉,不是像其他的扁平化(仅限Win10状态下)
立体感觉:
扁平感觉:
代码区:
#PRE_Res_requestedExecutionLevel=None
#PRE_Run_Tidy=y
#include <ButtonConstants.au3>
#include <GUIConstantsEx.au3>
#include <GuiListView.au3>
#include <ColorConstants.au3>
#include <ListViewConstants.au3>
#include <WinAPITheme.au3>
#Region ### START Koda GUI section ### Form=
Global $iExStyle = ""
Global $DefBkCol = 0xF9F9F9
Global $HighBkCol = 0x0094FF
$Form1 = GUICreate("Form1", 936, 608, 382, 200)
$Button1 = GUICtrlCreateButton("Button1", 8, 8, 65, 33)
$Button2 = GUICtrlCreateButton("Button2", 88, 8, 65, 33)
GUICtrlCreateLabel("", 8, 48, 913, 545)
$ListView1 = GUICtrlCreateListView("", 8, 48, 913, 545)
Global $hHeader = _GUICtrlListView_GetHeader($ListView1)
_WinAPI_SetWindowTheme($hHeader, "", "")
Dim $B_DESCENDING ;<==定义排序数组,必不可少
$iExStyle += $LVS_EX_GRIDLINES ; 项目和子项显示网格.
$iExStyle += $LVS_EX_FULLROWSELECT ; 项目选中时, 该项 及其所有子项高亮显示.
_GUICtrlListView_SetExtendedListViewStyle($ListView1, $iExStyle)
; 添加列
_GUICtrlListView_AddColumn($ListView1, "列 1", 10)
_GUICtrlListView_AddColumn($ListView1, "列 2", 150)
_GUICtrlListView_AddColumn($ListView1, "列 3", 150)
_GUICtrlListView_JustifyColumn($ListView1, 0, 2)
_GUICtrlListView_JustifyColumn($ListView1, 1, 2)
_GUICtrlListView_JustifyColumn($ListView1, 2, 2)
GUICtrlCreateListViewItem("行 1: 列 1|行 1: 列 2|行 1: 列 3", $ListView1)
GUICtrlCreateListViewItem("行 2: 列 1|行 2: 列 2", $ListView1)
GUICtrlCreateListViewItem("行 3: 列 1|", $ListView1)
_GUICtrlListView_SetColumnWidth($ListView1, 0, $LVSCW_AUTOSIZE_USEHEADER)
_GUICtrlListView_SetBkColor($ListView1, $DefBkCol)
_GUICtrlListView_SetTextBkColor($ListView1, $DefBkCol)
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###
While 1
$nMsg = GUIGetMsg()
Switch $nMsg
Case $GUI_EVENT_CLOSE
Exit
Case $Button1
For $a = 0 To 2
;~ $a = ControlListView($Form1, "", $ListView1, "FindItem", "行 1: 列 1")
GUICtrlSetBkColor(_GUICtrlListView_GetItemParam($ListView1, $a), $HighBkCol);更新颜色
GUICtrlSetData(_GUICtrlListView_GetItemParam($ListView1, $a), "||1");更新数据
Sleep(1000)
GUICtrlSetBkColor(_GUICtrlListView_GetItemParam($ListView1, $a), $DefBkCol);恢复颜色
Next
EndSwitch
WEnd
=======================
说了这么久,我好像也没太说清我想要请教的内容:
1、何如更改ListView列标题区域背景颜色(非变更WindowTheme方式)
2、设置控件文本的背景颜色前可否能够获取当前的背景色(想法是先获取当前的背景色,改为高亮之后恢复为原来的背景色)
万分感谢各位!
:face (23):
本帖最后由 kk_lee69 于 2020-8-7 00:03 编辑
https://www.autoitx.com/forum.ph ... hlight=%EC%C5%B2%CA
這裡不是有很多類似的
https://www.autoitx.com/forum.php?mod=viewthread&tid=13682
本帖最后由 kk_lee69 于 2020-8-7 00:23 编辑
;coded by rover 2k11
#AutoIt3Wrapper_Au3Check_Parameters=-d -w 1 -w 2 -w 3 -w 4 -w 5 -w 6
#include <GuiConstantsEx.au3>
#include <WindowsConstants.au3>
#include <FontConstants.au3>
#include <GuiListView.au3>
#include <Constants.au3>
Opt('MustDeclareVars', 1)
Global $hGUI, $cListView, $hListView
Global $iDllGDI = DllOpen("gdi32.dll")
Global $iDllUSER32 = DllOpen("user32.dll")
;Three column colours
Global $aCol = [,,]
;One colour to rule them all
;blow off array and just set SetTextColor() / SetBkColor() with one colour
;Global $aCol = [, , ]
;Convert RBG to BGR for SetText/BkColor()
For $i = 0 To UBound($aCol)-1
$aCol[$i] = _BGR2RGB($aCol[$i])
$aCol[$i] = _BGR2RGB($aCol[$i])
Next
$hGUI = GUICreate("Set Listview Header Colour ", 500, 300)
GUISetBkColor(0xFFFFFF)
$cListView = GUICtrlCreateListView("Items List|SubItems1|SubItems2", 10, 10, 480, 280)
;get ListView handle from control ID
$hListView = GUICtrlGetHandle($cListView)
_GUICtrlListView_SetExtendedListViewStyle($hListView, BitOR($LVS_EX_DOUBLEBUFFER, $LVS_EX_GRIDLINES, $LVS_EX_FULLROWSELECT))
GUICtrlSetFont(-1, 9, 800, 0, "Comic Sans MS", $ANTIALIASED_QUALITY)
;get handle to child SysHeader32 control of ListView
Global $hHeader = HWnd(GUICtrlSendMsg($cListView, $LVM_GETHEADER, 0, 0))
;Turn off theme for header
DllCall("uxtheme.dll", "int", "SetWindowTheme", "hwnd", $hHeader, "wstr", "", "wstr", "")
;subclass ListView to get at NM_CUSTOMDRAW notification sent to ListView
Global $wProcNew = DllCallbackRegister("_LVWndProc", "ptr", "hwnd;uint;wparam;lparam")
Global $wProcOld = _WinAPI_SetWindowLong($hListView, $GWL_WNDPROC, DllCallbackGetPtr($wProcNew))
;Optional: Flat Header - remove header 3D button effect
Global $iStyle = _WinAPI_GetWindowLong($hHeader, $GWL_STYLE)
_WinAPI_SetWindowLong($hHeader, $GWL_STYLE, BitOR($iStyle, $HDS_FLAT))
For $i = 1 To 15
_GUICtrlListView_AddItem($hListView, "Item" & $i)
_GUICtrlListView_AddSubItem($hListView, $i - 1, "SubItem" & $i, 1)
_GUICtrlListView_AddSubItem($hListView, $i - 1, "SubItem" & $i, 2)
Next
_GUICtrlListView_SetColumnWidth($hListView, 0, $LVSCW_AUTOSIZE_USEHEADER)
_GUICtrlListView_SetColumnWidth($hListView, 1, $LVSCW_AUTOSIZE_USEHEADER)
_GUICtrlListView_SetColumnWidth($hListView, 2, $LVSCW_AUTOSIZE_USEHEADER)
GUISetState()
Do
Until GUIGetMsg() = $GUI_EVENT_CLOSE
If $wProcOld Then _WinAPI_SetWindowLong($hListView, $GWL_WNDPROC, $wProcOld)
; Delete callback function
If $wProcNew Then DllCallbackFree($wProcNew)
GUIDelete()
Exit
Func _LVWndProc($hWnd, $iMsg, $wParam, $lParam)
#forceref $hWnd, $iMsg, $wParam
If $iMsg = $WM_NOTIFY Then
Local $tNMHDR, $hWndFrom, $iCode, $iItem, $hDC
$tNMHDR = DllStructCreate($tagNMHDR, $lParam)
$hWndFrom = HWnd(DllStructGetData($tNMHDR, "hWndFrom"))
$iCode = DllStructGetData($tNMHDR, "Code")
;Local $IDFrom = DllStructGetData($tNMHDR, "IDFrom")
Switch $hWndFrom
Case $hHeader
Switch $iCode
Case $NM_CUSTOMDRAW
Local $tCustDraw = DllStructCreate($tagNMLVCUSTOMDRAW, $lParam)
Switch DllStructGetData($tCustDraw, "dwDrawStage")
Case $CDDS_PREPAINT
Return $CDRF_NOTIFYITEMDRAW
Case $CDDS_ITEMPREPAINT
$hDC = DllStructGetData($tCustDraw, "hDC")
$iItem = DllStructGetData($tCustDraw, "dwItemSpec")
DllCall($iDllGDI, "int", "SetTextColor", "handle", $hDC, "dword", $aCol[$iItem])
DllCall($iDllGDI, "int", "SetBkColor", "handle", $hDC, "dword", $aCol[$iItem])
Return $CDRF_NEWFONT
Return $CDRF_SKIPDEFAULT
EndSwitch
EndSwitch
EndSwitch
EndIf
;pass the unhandled messages to default WindowProc
Local $aResult = DllCall($iDllUSER32, "lresult", "CallWindowProcW", "ptr", $wProcOld, _
"hwnd", $hWnd, "uint", $iMsg, "wparam", $wParam, "lparam", $lParam)
If @error Then Return -1
Return $aResult
EndFunc ;==>_LVWndProc
Func _BGR2RGB($iColor)
;Author: Wraithdu
Return BitOR(BitShift(BitAND($iColor, 0x0000FF), -16), BitAND($iColor, 0x00FF00), BitShift(BitAND($iColor, 0xFF0000), 16))
EndFunc ;==>_BGR2RGB
https://www.autoitscript.com/forum/topic/178680-customowner-drawn-multi-line-header-in-listview/
本帖最后由 yuantian 于 2020-8-7 06:27 编辑
kk_lee69 发表于 2020-8-7 00:33
https://www.autoitscript.com/forum/topic/178680-customowner-drawn-multi-line-header-in-listview/ ...
以上的案例我都挨个看了一遍,首先我还是比较倾向于用AU3自身的东西,尽量不用炫彩的UDF,
然后之后的那几个实例,我也都试过。
我是想要实现统一修改整个行标题区域背景颜色(包括有内容的和无内容的),并不是想要修改某一列的标题栏背景颜色的。
这里没得办法修改背景颜色
能达到目的就行,何必纠结过程呢 guland 发表于 2020-8-7 08:02
能达到目的就行,何必纠结过程呢
我的两个问题都还没解决呢,过程也很重要啊。。
如果我整行列标题 想要更改其他的颜色呢??
或者是我想先获取控件文本当前的颜色呢?? yuantian 发表于 2020-8-7 14:19
我的两个问题都还没解决呢,过程也很重要啊。。
如果我整行列标题 想要更改其他的颜色呢??
或者是我 ...
kk_lee69 发表于 2020-8-9 17:17
求助,折腾了N久,依旧还是只有当前有内容的行标题包含了颜色,无内容的依旧灰色。。 yuantian 发表于 2020-8-10 00:01
求助,折腾了N久,依旧还是只有当前有内容的行标题包含了颜色,无内容的依旧灰色。。
将最末一列设置成自适应宽度,就没有空白的了~
_GUICtrlListView_SetColumnWidth($ListView, 最末一列, $LVSCW_AUTOSIZE_USEHEADER) yuantian 发表于 2020-8-10 00:01
求助,折腾了N久,依旧还是只有当前有内容的行标题包含了颜色,无内容的依旧灰色。。
我是偷雞的 .............
看過很多資料 大概是無法做到了只剩下
1. 多設一個 最後的空白列
2. 就如同 afan 老大說的設自适应宽度
3. 禁止 最後一列 拉寬度 afan 发表于 2020-8-10 00:21
将最末一列设置成自适应宽度,就没有空白的了~
_GUICtrlListView_SetColumnWidth($ListView, 最末一列,...
感谢A版大大,,这个默认的确没问题,算是另辟蹊径。 kk_lee69 发表于 2020-8-10 01:02
我是偷雞的 .............
看過很多資料 大概是無法做到了只剩下
多设置一个空白,没问题。
自适应宽度也没问题。
这个第三个 禁止最后一列拉宽度?这个操作我没见到过昂,。。。请问如何操作? afan 发表于 2020-8-10 00:21
将最末一列设置成自适应宽度,就没有空白的了~
_GUICtrlListView_SetColumnWidth($ListView, 最末一列,...
A版大大,再请教我之前求助的问题2,如何获取列表序列中某一行的文字的背景颜色??? yuantian 发表于 2020-8-10 22:31
A版大大,再请教我之前求助的问题2,如何获取列表序列中某一行的文字的背景颜色???
这个没试过。但可以个人经验建议,此类获取数据问题,除非是系统自动控制,或是第三方程序无法控制,其它的人为设置的数据均可在设置时保存该数据,比其它什么获取方式都来得快。
页:
[1]
2