yuantian 发表于 2020-8-6 21:31:18

请教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:00:54

本帖最后由 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:20:56

本帖最后由 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


kk_lee69 发表于 2020-8-7 00:33:53



https://www.autoitscript.com/forum/topic/178680-customowner-drawn-multi-line-header-in-listview/

yuantian 发表于 2020-8-7 06:24:34

本帖最后由 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:27

能达到目的就行,何必纠结过程呢

yuantian 发表于 2020-8-7 14:19:10

guland 发表于 2020-8-7 08:02
能达到目的就行,何必纠结过程呢

我的两个问题都还没解决呢,过程也很重要啊。。
如果我整行列标题 想要更改其他的颜色呢??
或者是我想先获取控件文本当前的颜色呢??

kk_lee69 发表于 2020-8-9 17:17:57

yuantian 发表于 2020-8-7 14:19
我的两个问题都还没解决呢,过程也很重要啊。。
如果我整行列标题 想要更改其他的颜色呢??
或者是我 ...


yuantian 发表于 2020-8-10 00:01:37

kk_lee69 发表于 2020-8-9 17:17


求助,折腾了N久,依旧还是只有当前有内容的行标题包含了颜色,无内容的依旧灰色。。

afan 发表于 2020-8-10 00:21:48

yuantian 发表于 2020-8-10 00:01
求助,折腾了N久,依旧还是只有当前有内容的行标题包含了颜色,无内容的依旧灰色。。
将最末一列设置成自适应宽度,就没有空白的了~
_GUICtrlListView_SetColumnWidth($ListView, 最末一列, $LVSCW_AUTOSIZE_USEHEADER)

kk_lee69 发表于 2020-8-10 01:02:53

yuantian 发表于 2020-8-10 00:01
求助,折腾了N久,依旧还是只有当前有内容的行标题包含了颜色,无内容的依旧灰色。。

我是偷雞的 .............

看過很多資料 大概是無法做到了只剩下

1. 多設一個 最後的空白列
2. 就如同 afan 老大說的設自适应宽度
3. 禁止 最後一列 拉寬度

yuantian 发表于 2020-8-10 22:29:39

afan 发表于 2020-8-10 00:21
将最末一列设置成自适应宽度,就没有空白的了~
_GUICtrlListView_SetColumnWidth($ListView, 最末一列,...

感谢A版大大,,这个默认的确没问题,算是另辟蹊径。

yuantian 发表于 2020-8-10 22:30:26

kk_lee69 发表于 2020-8-10 01:02
我是偷雞的 .............

看過很多資料 大概是無法做到了只剩下


多设置一个空白,没问题。
自适应宽度也没问题。
这个第三个 禁止最后一列拉宽度?这个操作我没见到过昂,。。。请问如何操作?

yuantian 发表于 2020-8-10 22:31:30

afan 发表于 2020-8-10 00:21
将最末一列设置成自适应宽度,就没有空白的了~
_GUICtrlListView_SetColumnWidth($ListView, 最末一列,...

A版大大,再请教我之前求助的问题2,如何获取列表序列中某一行的文字的背景颜色???

afan 发表于 2020-8-10 22:38:53

yuantian 发表于 2020-8-10 22:31
A版大大,再请教我之前求助的问题2,如何获取列表序列中某一行的文字的背景颜色???
这个没试过。但可以个人经验建议,此类获取数据问题,除非是系统自动控制,或是第三方程序无法控制,其它的人为设置的数据均可在设置时保存该数据,比其它什么获取方式都来得快。
页: [1] 2
查看完整版本: 请教ListView颜色变更的方式