kk_lee69 发表于 2020-8-10 23:34:50

yuantian 发表于 2020-8-10 22:31
A版大大,再请教我之前求助的问题2,如何获取列表序列中某一行的文字的背景颜色???

...........代碼來自官網

#Include <WinAPIEx.au3>
_Main()
Func _Main()
    Local $GUI, $Label, $Color_Array = ; Random Color Array.
    $GUI = GUICreate("GUI")
    $Label = GUICtrlCreateLabel("", 0, 0, 500, 350)
    GUISetState(@SW_SHOW)
    For $A = 1 To $Color_Array
      GUICtrlSetBkColor($Label, $Color_Array[$A])
      Sleep(20)
      MsgBox(0, "GUICtrlGetBkColor()", "The background color is >> 0x" & Hex($Color_Array[$A], 6) & @CRLF & _
                "and GUICtrlGetBkColor() says it's >> 0x" & Hex(GUICtrlGetBkColor($GUI, $Label), 6)) ; Pass the GUI Handle & Label ID to the Function.
    Next
    Exit
EndFunc   ;==>_Main
; #FUNCTION# =========================================================================================================
; Name...........: GUICtrlGetBkColor
; Description ...: Retrieves the hex value of the control background.
; Syntax.........: GUICtrlGetBkColor($hHandle, $iControl)
; Parameters ....: $hHandle - A valid GUI handle.
;                  $iControl - A valid control ID.
; Requirement(s).: v3.3.2.0 or higher
; Return values .: Success - Returns hex value of the control background.
;                  Failure - Returns 0 & sets @error = 1
; Author ........: guinness & additional information from Yashied.
; Example........; Yes
;=====================================================================================================================
Func GUICtrlGetBkColor($hHandle, $iControl)
;   Local $aControlGetPos = ControlGetPos($hHandle, "", $iControl)
;   Local $bReturn = PixelGetColor($aControlGetPos, $aControlGetPos, $hHandle)
;   If Not @error Then Return "0x" & Hex($bReturn, 6)
;   Return SetError(1, 0, 0)
    Local $hWnd = GUICtrlGetHandle($iControl)
    Local $hDC = _WinAPI_GetDC($hWnd)
    Local $Rgb = _WinAPI_GetPixel($hDC, 0, 0)
    _WinAPI_ReleaseDC($hWnd, $hDC)
    Return $Rgb
EndFunc   ;==>GUICtrlGetBkColor

kk_lee69 发表于 2020-8-10 23:38:33

yuantian 发表于 2020-8-10 22:30
多设置一个空白,没问题。
自适应宽度也没问题。
这个第三个 禁止最后一列拉宽度?这个操作我没见到过 ...
效果一


#include <GuiConstantsEx.au3>
#include <WindowsConstants.au3>
#include <FontConstants.au3>
#include <GuiListView.au3>
Global Const $tagNMCUSTOMDRAW = "struct;" & $tagNMHDR & ";dword dwDrawStage;handle hdc;" & $tagRECT & _
                              ";dword_ptr dwItemSpec;uint uItemState;lparam lItemlParam;endstruct"
;                        Title    TextCol   BkCol         - colours in BGR
Global $aHdrData[][] = [["Tom",   0x000000, 0x00FFFF], _
                        ["Dick",0x00FFFF, 0x0000FF], _
                        ["Harry", 0xFF0000, 0xFFCCCC] _
                        ]
Global $colCount = UBound($aHdrData)

$hGUI = GUICreate("Set Listview Header Colour ", 500, 300)
$cListView = GUICtrlCreateListView(_ArrayToString(_ArrayExtract($aHdrData, 0, $colCount-1, 0, 0)), 10, 10, 480, 280)
$hListView = GUICtrlGetHandle($cListView)
_GUICtrlListView_SetExtendedListViewStyle($cListView, $LVS_EX_FULLROWSELECT) ; BitOR($LVS_EX_DOUBLEBUFFER, $LVS_EX_GRIDLINES, $LVS_EX_FULLROWSELECT))
;Get header handle
Global $hHeader = _GUICtrlListView_GetHeader($cListView)
; Get the font of the Header control (credit KaFu)
Local $hDC = _WinAPI_GetDC($hHeader)
Local $hFont = _SendMessage($hHeader, $WM_GETFONT)
Local $hObject = _WinAPI_SelectObject($hDC, $hFont)
Local $tLogFont = DllStructCreate($tagLOGFONT)
_WinAPI_GetObject($hFont, DllStructGetSize($tLogFont), DllStructGetPtr($tLogFont))
_WinAPI_SelectObject($hDC, $hObject)
_WinAPI_ReleaseDC($hHeader, $hDC)
Local $iWeight = DllStructGetData( $tLogFont, "Weight" )               ; Bold
DllStructSetData( $tLogFont, "Weight", BitOR( $iWeight, $FW_BOLD ) )
$hHdrFont = _WinAPI_CreateFontIndirect( $tLogFont )
For $i = 1 To 15
    _GUICtrlListView_AddItem($cListView, "Item" & $i)
    _GUICtrlListView_AddSubItem($cListView, $i - 1, "SubItem" & $i, 1)
    _GUICtrlListView_AddSubItem($cListView, $i - 1, "SubItem" & $i, 2)
Next
For $i = 0 To$colCount - 1
    _GUICtrlListView_SetColumnWidth($cListView, $i, $LVSCW_AUTOSIZE_USEHEADER)
Next
GUIRegisterMsg($WM_NOTIFY, "_WM_NOTIFY")
GUISetState()
Do
Until GUIGetMsg() = $GUI_EVENT_CLOSE
Func _WM_NOTIFY($hWnd, $iMsg, $wParam, $lParam)
    #forceref $hWnd, $iMsg, $wParam
    ; Struct = $tagNMHDR and "int Item;int SubItem" from $tagNMLISTVIEW
    Local $tStruct = DllStructCreate("hwnd;uint_ptr;int_ptr;int;int", $lParam)
    If @error Then Return


    Local $tNMHEADER = DllStructCreate($tagNMHEADER, $lParam)
    If HWnd( DllStructGetData($tNMHEADER, "hWndFrom")) = $hHeader Then
      Local $iCode = BitAND(DllStructGetData($tStruct, 3), 0xFFFFFFFF)
      Local Static $lastRect = 0
      Switch $iCode
            Case $HDN_TRACKW,$HDN_ENDTRACKW
    ConsoleWrite("C"&@CRLF)
                Local $pos = ControlGetPos($hGUI, "", $cListView)
                Local $rectLast = _GUICtrlListView_GetSubItemRect($hListView, _GUICtrlListView_GetItemCount($cListView) - 1, $colCount - 1, 0)
                If $pos > $rectLast Then
                  Local Static $scrollbarWidth = _WinAPI_GetSystemMetrics($SM_CXVSCROLL)
                  Local $rectFirst = _GUICtrlListView_GetItemRect($hListView, 0)
                  Local $sw = ($rectFirst < 0 Or $rectLast > $pos) ? $scrollbarWidth : 0
                  GUICtrlSendMsg( $cListView, $LVM_SETCOLUMNWIDTH, $colCount-1, $pos - $rectLast - $sw - 4);resize last column
                  Return True
                EndIf
   

   
            Case $NM_CUSTOMDRAW
                Local $tNMCustomDraw = DllStructCreate($tagNMCUSTOMDRAW, $lParam)
                Local $dwDrawStage = DllStructGetData($tNMCustomDraw, "dwDrawStage")
                Switch $dwDrawStage ; Holds a value that specifies the drawing stage
                  Case $CDDS_PREPAINT ; Before the paint cycle begins
                        Return $CDRF_NOTIFYITEMDRAW ; Notify parent window of any item related drawing operations
                  Case $CDDS_ITEMPREPAINT ; Before an item is drawn: Default painting (frames and background)
                        Return $CDRF_NOTIFYPOSTPAINT ; Notify parent window of any post item related drawing operations
                  Case $CDDS_ITEMPOSTPAINT ; After an item is drawn: Custom painting (item texts)
                        Local $tRECT = DllStructCreate($tagRECT)
                        Local $iIndex = DllStructGetData($tNMCustomDraw, "dwItemSpec") ; Item index
                        Local $hDC = DllStructGetData($tNMCustomDraw, "hdc") ; Device context
                        _WinAPI_SelectObject($hDC, $hHdrFont) ; Set text font
                        _WinAPI_SetBkMode($hDC, $TRANSPARENT) ; Transparent background
                        _WinAPI_SetTextColor( $hDC, $aHdrData[$iIndex]) ; Set text colour
                        ; Get header section size
                        DllStructSetData($tRECT, 1, DllStructGetData($tNMCustomDraw, 6) + 1)
                        DllStructSetData($tRECT, 2, DllStructGetData($tNMCustomDraw, 7) + 1)
                        DllStructSetData($tRECT, 3, DllStructGetData($tNMCustomDraw, 8) - 2)
                        DllStructSetData($tRECT, 4, DllStructGetData($tNMCustomDraw, 9) - 2)
                        ; Set and draw back colour
                        Local $hBrush = _WinAPI_CreateSolidBrush($aHdrData[$iIndex])
                        _WinAPI_FillRect($hDC, $tRECT, $hBrush)
                        ; Write text
                        If $iIndex < _GUICtrlListView_GetColumnCount($cListView) Then
                            _WinAPI_DrawText ( $hDC, $aHdrData[$iIndex], $tRECT, $DT_CENTER + $DT_VCENTER )
                        EndIf
                        Return $CDRF_NEWFONT ; $CDRF_NEWFONT must be returned after changing font or colors
                EndSwitch
      EndSwitch
    EndIf
EndFunc   ;==>_WM_NOTIFY


kk_lee69 发表于 2020-8-10 23:42:11

yuantian 发表于 2020-8-10 22:30
多设置一个空白,没问题。
自适应宽度也没问题。
这个第三个 禁止最后一列拉宽度?这个操作我没见到过 ...

效果二


#include <GuiConstantsEx.au3>
#include <WindowsConstants.au3>
#include <FontConstants.au3>
#include <GuiListView.au3>
Global Const $tagNMCUSTOMDRAW = "struct;" & $tagNMHDR & ";dword dwDrawStage;handle hdc;" & $tagRECT & _
                              ";dword_ptr dwItemSpec;uint uItemState;lparam lItemlParam;endstruct"
;                        Title    TextCol   BkCol         - colours in BGR
Global $aHdrData[][] = [["Tom",   0x000000, 0x00FFFF], _
                        ["Dick",0x00FFFF, 0x0000FF], _
                        ["Harry", 0xFF0000, 0xFFCCCC] _
                        ]
Global $colCount = UBound($aHdrData)

$hGUI = GUICreate("Set Listview Header Colour ", 500, 300)
$cListView = GUICtrlCreateListView(_ArrayToString(_ArrayExtract($aHdrData, 0, $colCount-1, 0, 0)), 10, 10, 480, 280)
$hListView = GUICtrlGetHandle($cListView)
_GUICtrlListView_SetExtendedListViewStyle($cListView, $LVS_EX_FULLROWSELECT) ; BitOR($LVS_EX_DOUBLEBUFFER, $LVS_EX_GRIDLINES, $LVS_EX_FULLROWSELECT))
;Get header handle
Global $hHeader = _GUICtrlListView_GetHeader($cListView)
; Get the font of the Header control (credit KaFu)
Local $hDC = _WinAPI_GetDC($hHeader)
Local $hFont = _SendMessage($hHeader, $WM_GETFONT)
Local $hObject = _WinAPI_SelectObject($hDC, $hFont)
Local $tLogFont = DllStructCreate($tagLOGFONT)
_WinAPI_GetObject($hFont, DllStructGetSize($tLogFont), DllStructGetPtr($tLogFont))
_WinAPI_SelectObject($hDC, $hObject)
_WinAPI_ReleaseDC($hHeader, $hDC)
Local $iWeight = DllStructGetData( $tLogFont, "Weight" )               ; Bold
DllStructSetData( $tLogFont, "Weight", BitOR( $iWeight, $FW_BOLD ) )
$hHdrFont = _WinAPI_CreateFontIndirect( $tLogFont )
For $i = 1 To 15
    _GUICtrlListView_AddItem($cListView, "Item" & $i)
    _GUICtrlListView_AddSubItem($cListView, $i - 1, "SubItem" & $i, 1)
    _GUICtrlListView_AddSubItem($cListView, $i - 1, "SubItem" & $i, 2)
Next
For $i = 0 To$colCount - 1
    _GUICtrlListView_SetColumnWidth($cListView, $i, $LVSCW_AUTOSIZE_USEHEADER)
Next
GUIRegisterMsg($WM_NOTIFY, "_WM_NOTIFY")
GUISetState()
Do
Until GUIGetMsg() = $GUI_EVENT_CLOSE
Func _WM_NOTIFY($hWnd, $iMsg, $wParam, $lParam)
    #forceref $hWnd, $iMsg, $wParam
    ; Struct = $tagNMHDR and "int Item;int SubItem" from $tagNMLISTVIEW
    Local $tStruct = DllStructCreate("hwnd;uint_ptr;int_ptr;int;int", $lParam)
    If @error Then Return


    Local $tNMHEADER = DllStructCreate($tagNMHEADER, $lParam)
    If HWnd( DllStructGetData($tNMHEADER, "hWndFrom")) = $hHeader Then
      Local $iCode = BitAND(DllStructGetData($tStruct, 3), 0xFFFFFFFF)
      Local Static $lastRect = 0
      Switch $iCode

   Case$HDN_BEGINTRACKW
    ; Now get column being resized
    Local $iCol = DllStructGetData($tNMHEADER, "Item")
    If $iCol = 2 Then;0 為第0列
   ; Prevent resizing
   Return True
    Else
   ; Allow resizing
   Return False
    EndIf

   
            Case $NM_CUSTOMDRAW
                Local $tNMCustomDraw = DllStructCreate($tagNMCUSTOMDRAW, $lParam)
                Local $dwDrawStage = DllStructGetData($tNMCustomDraw, "dwDrawStage")
                Switch $dwDrawStage ; Holds a value that specifies the drawing stage
                  Case $CDDS_PREPAINT ; Before the paint cycle begins
                        Return $CDRF_NOTIFYITEMDRAW ; Notify parent window of any item related drawing operations
                  Case $CDDS_ITEMPREPAINT ; Before an item is drawn: Default painting (frames and background)
                        Return $CDRF_NOTIFYPOSTPAINT ; Notify parent window of any post item related drawing operations
                  Case $CDDS_ITEMPOSTPAINT ; After an item is drawn: Custom painting (item texts)
                        Local $tRECT = DllStructCreate($tagRECT)
                        Local $iIndex = DllStructGetData($tNMCustomDraw, "dwItemSpec") ; Item index
                        Local $hDC = DllStructGetData($tNMCustomDraw, "hdc") ; Device context
                        _WinAPI_SelectObject($hDC, $hHdrFont) ; Set text font
                        _WinAPI_SetBkMode($hDC, $TRANSPARENT) ; Transparent background
                        _WinAPI_SetTextColor( $hDC, $aHdrData[$iIndex]) ; Set text colour
                        ; Get header section size
                        DllStructSetData($tRECT, 1, DllStructGetData($tNMCustomDraw, 6) + 1)
                        DllStructSetData($tRECT, 2, DllStructGetData($tNMCustomDraw, 7) + 1)
                        DllStructSetData($tRECT, 3, DllStructGetData($tNMCustomDraw, 8) - 2)
                        DllStructSetData($tRECT, 4, DllStructGetData($tNMCustomDraw, 9) - 2)
                        ; Set and draw back colour
                        Local $hBrush = _WinAPI_CreateSolidBrush($aHdrData[$iIndex])
                        _WinAPI_FillRect($hDC, $tRECT, $hBrush)
                        ; Write text
                        If $iIndex < _GUICtrlListView_GetColumnCount($cListView) Then
                            _WinAPI_DrawText ( $hDC, $aHdrData[$iIndex], $tRECT, $DT_CENTER + $DT_VCENTER )
                        EndIf
                        Return $CDRF_NEWFONT ; $CDRF_NEWFONT must be returned after changing font or colors
                EndSwitch
      EndSwitch
    EndIf
EndFunc   ;==>_WM_NOTIFY


yuantian 发表于 2020-8-11 21:17:20

afan 发表于 2020-8-10 22:38
这个没试过。但可以个人经验建议,此类获取数据问题,除非是系统自动控制,或是第三方程序无法控制,其它 ...

还是指定靠谱。。。好的,谢谢
:)

yuantian 发表于 2020-8-11 21:18:04

kk_lee69 发表于 2020-8-10 23:42
效果二




特别靠谱,万分感谢。
{:face (190):}

afan 发表于 2020-8-11 21:23:13

本帖最后由 afan 于 2020-8-11 21:30 编辑

yuantian 发表于 2020-8-11 21:18
特别靠谱,万分感谢。
往左拖动红蓝交界看看是不是“特别靠谱”
如果你想使用该法,禁用一列是不行的,全禁才行。

yuantian 发表于 2020-8-11 23:20:47

afan 发表于 2020-8-11 21:23
往左拖动红蓝交界看看是不是“特别靠谱”
如果你想使用该法,禁用一列是不行的,全禁才行。

是的,样式二,改成全禁止调整,很舒服..
页: 1 [2]
查看完整版本: 请教ListView颜色变更的方式