返回列表 发帖

[AU3基础] 虚拟列表 LISTVIEW的颜色自定义 如何更改内定的高亮颜色

虚拟列表 LISTVIEW的颜色自定义 如何更改内定的高亮颜色

虚拟列表 LISTVIEW 的 颜色自定义,如何更改内定的选中 高亮颜色

请看以下的程序  求高手帮忙 解决是哪个区块有问题

如何 无法更改 高亮颜色

标准的 LISTVIE 可以更改  如 右边的图

理论上 左边的图 单击后应该也要能够秀出 像右边的图 那样子的 黑色 黄色字才对

请高手帮忙完善程序




  1. #PRE_UseX64=n

  2. #include <WindowsConstants.au3>

  3. #include <GUIConstantsEx.au3>

  4. #include <GuiImageList.au3>

  5. ;#include <WinAPITheme.au3>

  6. #include <GuiListView.au3>

  7. #include <WinAPISys.au3>

  8. #include <WinAPI.au3>

  9. #include <GuiEdit.au3>

  10. #include <array.au3>

  11. #include <Misc.au3>

  12.  

  13. Global $B_DESCENDING[3] ; 排序用陣列

  14.  

  15. Global $hActLst

  16. Global $bCtrlDown = False;listview控制項ctrl鍵按下標識

  17. Global $hEdit, $Item = -1, $SubItem = 0

  18. Global $hEnter, $aAccelKeys[1][2] = [["{ENTER}", $hEnter]];虛擬控制項的控制碼和綁定的快速鍵

  19.  

  20. Local $hUser32 = DllOpen("user32.dll")

  21. Local $ichked = 0;勾選的行數

  22. Local $tText = DllStructCreate("wchar Text[256]");建個結構,用來放listview列資料

  23. Local $GUI, $hImage

  24. Local $iITEM_COUNT = 1000, $aShowdata[$iITEM_COUNT][4], $aShowdata2[$iITEM_COUNT][4], $aShowdata3[$iITEM_COUNT][4];注意陣列最大專案數為2^24(16777216),所以$iITEM_COUNT = 4194304為二維陣列$aShowdata最大行數

  25. Local $sSomeString = ""

  26. Local $hGUI, $hListView, $hListView2, $hListView3

  27.  

  28. Global $aFont1 = DLLCall("gdi32.dll","int","CreateFont", "int", 14, "int", 0, "int", 0, "int", 0, "int", 700, _

  29. "dword", 0, "dword", 0, "dword", 0, "dword", 0, "dword", 0, "dword", 0, "dword", 0, _

  30. "dword", 0, "str", "")

  31. ;italic

  32. Global $aFont2 = DLLCall("gdi32.dll","int","CreateFont", "int", 14, "int", 0, "int", 0, "int", 0, "int", 400, _

  33. "dword", 1, "dword", 0, "dword", 0, "dword", 0, "dword", 0, "dword", 0, "dword", 0, _

  34. "dword", 0, "str", "")

  35.  

  36.  

  37. GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY")

  38. $hGUI = GUICreate("ListView虛表 載入[" & UBound($aShowdata) & "]資料 核取方塊 原地編輯例子 By_Crossdoor", 600, 605)

  39.  

  40.  

  41.  

  42.  

  43. $hListView2 = GUICtrlCreateListView("$hListView2| | ", 100, 2, 295, 296, BitOR($LVS_REPORT, $LVS_SINGLESEL, $LVS_SHOWSELALWAYS, $LVS_OWNERDATA), $LVS_EX_GRIDLINES + $LVS_EX_FULLROWSELECT + $LVS_EX_DOUBLEBUFFER + $LVS_EX_CHECKBOXES)

  44. ;~ _WinAPI_SetWindowTheme(GUICtrlGetHandle($hListView), "Explorer");設置主題

  45.  

  46. ;設置列寬

  47. GUICtrlSendMsg($hListView2, $LVM_SETCOLUMNWIDTH, 0, 110)

  48. GUICtrlSendMsg($hListView2, $LVM_SETCOLUMNWIDTH, 1, 80)

  49. GUICtrlSendMsg($hListView2, $LVM_SETCOLUMNWIDTH, 2, 80)

  50. GUICtrlSendMsg($hListView2, $LVM_SETITEMCOUNT, $iITEM_COUNT, 0);設定數據總數

  51.  

  52.  

  53.  

  54. ;===========創建並關聯圖像清單


  55. _GUIImageList_AddIcon($hImage, @SystemDir & "\shell32.dll", 110)

  56. _GUICtrlListView_SetImageList($hListView, $hImage, 1);分配圖像清單到清單視圖控制項$hListView

  57. _GUICtrlListView_SetImageList($hListView2, $hImage, 1);分配圖像清單到清單視圖控制項$hListView2

  58.  

  59.  


  60.  

  61. ;==================在表單顯示後再初始化資料,因為初始化陣列資料比較慢

  62. ;如果先初始化陣列後顯示視窗,會卡很久,就造成虛表也很慢的假像

  63. For $i = 0 To $iITEM_COUNT - 1

  64.     ;重繪 刷新 listview 0-13行(讓ListView顯示陣列資料),不用太多行,只需要一屏的行數就就可以

  65.     ;因為下拉滾動的時候listview會收到LVN_GETDISPINFO消息,這個消息我們在WM_NOTIFY內處理過了

  66.     If $i = 18 Then

  67.         GUICtrlSendMsg($hListView2, $LVM_REDRAWITEMS, 0, $i)

  68.  

  69.     EndIf

  70.    

  71.    

  72.     $aShowdata2[$i][0] = "2爺爺" & $i

  73.     $aShowdata2[$i][1] = "2爸爸" & $i

  74.     $aShowdata2[$i][2] = "2兒子" & $i

  75.     $aShowdata2[$i][3] = 4096;核取方塊狀態4096未選中 8192選中

  76.    

  77.    


  78.  


  79.     $bCtrlDown = _IsPressed("11", $hUser32);取ctrl按鍵的狀態


  80.         Case -3

  81.             ExitLoop

  82.  

  83.     EndSwitch



  84. DllClose($hUser32)

  85.  

  86. Func WM_NOTIFY($hWnd, $iMsg, $iwParam, $ilParam)

  87.     #forceref $hWnd, $iMsg, $iwParam

  88.     Local $hWndFrom, $iIDFrom, $iCode, $tNMHDR, $tInfo

  89.  

  90.     $tNMHDR = DllStructCreate($tagNMHDR, $ilParam)

  91.     $hWndFrom = HWnd(DllStructGetData($tNMHDR, "hWndFrom"))

  92.     $iIDFrom = DllStructGetData($tNMHDR, "IDFrom")

  93.     $iCode = DllStructGetData($tNMHDR, "Code")

  94.    

  95.     Switch $iIDFrom

  96.          Case $hListView2

  97.             Switch $iCode

  98.                 Case -150, -177 ;$LVN_GETDISPINFOA = -150, $LVN_GETDISPINFOW = -177   請求顯示資料

  99.                     _LVN_GETDISPINFO($iIDFrom, $ilParam, $aShowdata2)

  100.                 Case $NM_CUSTOMDRAW;自繪消息  處理選中行背景色

  101.                                        

  102.                                         If Not _GUICtrlListView_GetViewDetails($hWndFrom) Then Return $GUI_RUNDEFMSG

  103.                                         Local $tCustDraw = DllStructCreate('hwnd hwndFrom;int idFrom;int code;' & _

  104.                                         'dword DrawStage;hwnd hdc;long rect[4];dword ItemSpec;int ItemState;dword Itemlparam;' & _

  105.                                         'dword clrText;dword clrTextBk;int SubItem;' & _

  106.                                         'dword ItemType;dword clrFace;int IconEffect;int IconPhase;int PartID;int StateID;long rectText[4];int Align', _ ;winxp or later

  107.                                         $ilParam), $iDrawStage, $iItem, $iSubitem, $hDC, $tRect, $iColor1, $iColor2, $iColor3

  108.                                         $iDrawStage = DllStructGetData($tCustDraw, 'DrawStage')

  109.                                         Switch $iDrawStage

  110.                                                 Case $CDDS_PREPAINT

  111.                                                         Return $CDRF_NOTIFYITEMDRAW

  112.                                                 Case $CDDS_ITEMPREPAINT

  113.                                                         Return $CDRF_NOTIFYSUBITEMDRAW

  114.                                                 Case $CDDS_ITEMPOSTPAINT

  115.                                                        

  116.                                                 Case BitOR($CDDS_ITEMPREPAINT, $CDDS_SUBITEM)

  117.                                                         $iItem = DllStructGetData($tCustDraw, 'ItemSpec')

  118.                                                         $iSubitem = DllStructGetData($tCustDraw, 'SubItem')

  119.                                                         If _GUICtrlListView_GetItemSelected($hWndFrom, $iItem) Then

  120.                                                                        

  121.                                                                 $hDC = _WinAPI_GetDC($hWndFrom)

  122.                                                                 $tRect = DllStructCreate('long;long;long;long')

  123.                                                                 If $iSubitem = 0 Then

  124.                                                                         DllCall('user32.dll','int','SendMessage', 'hwnd',$hWndFrom, 'uint',$LVM_GETSUBITEMRECT, 'wparam',$iItem, 'lparam',DllStructGetPtr($tRect))

  125.                                                                         DllStructSetData($tRect, 1, 2)

  126.                                                                         DllCall('user32.dll', 'int', 'FillRect', 'ptr', $hDC, 'ptr', DllStructGetPtr($tRect), 'int', _WinAPI_GetStockObject(4))

  127.                                                                 EndIf

  128.                                                                 DllStructSetData($tRect, 1, 2)

  129.                                                                 DllStructSetData($tRect, 2, $iSubitem)

  130.                                                                 DllCall('user32.dll','int','SendMessage', 'hwnd',$hWndFrom, 'uint',$LVM_GETSUBITEMRECT, 'wparam',$iItem, 'lparam',DllStructGetPtr($tRect))

  131.                                                                 ;Local $sText = _GUICtrlListView_GetItemText($hWndFrom, $iItem, $iSubitem)

  132.                                                                 Local $sText = $aShowdata2[$iItem][$iSubitem]

  133.                                                                 ;ConsoleWrite($sText&@CRLF)

  134.  

  135.                                                                 DLLCall("gdi32.dll","int","SetTextColor", "ptr", $hDC, "int", RGB2BGR(0xffff00))

  136.                                                                 DLLCall("gdi32.dll","int","SetBkMode", "ptr", $hDC, "int", 1)

  137.                                                                 DllStructSetData($tRect, 1, DllStructGetData($tRect, 1)+2)

  138.                                                                 ;ConsoleWrite($hDC&@CRLF)

  139.                                                                 _WinAPI_DrawText($hDC, $sText, $tRect, 0x8000) ;; $DT_END_ELLIPSIS

  140.                                                                 _WinAPI_ReleaseDC($hWndFrom, $hDC)

  141.                                                                 Return $CDRF_SKIPDEFAULT

  142.                                                                

  143.                                                         EndIf

  144.                                                         Switch $iItem

  145.                                                                 Case 0 To 9 ;for rows 1-10 lets do this

  146.                                                                         $iColor1 = RGB2BGR(0xFBFFD8)

  147.                                                                         $iColor2 = RGB2BGR(-1)

  148.                                                                         $iColor3 = RGB2BGR(0xFF0000)

  149.                                                                         If Mod($iSubitem, 2) Then ;odd columns

  150.                                                                         DllStructSetData($tCustDraw, 'clrTextBk', $iColor1)

  151.                                                                         DllStructSetData($tCustDraw, 'clrText', 0)

  152.                                                                         Else ;even columns

  153.                                                                         DllStructSetData($tCustDraw, 'clrTextBk', $iColor2)

  154.                                                                         DllStructSetData($tCustDraw, 'clrText', $iColor3)

  155.                                                                         EndIf

  156.                                                                 Case 10 To 19 ;for rows 11-20 lets do this

  157.                                                                         $iColor1 = RGB2BGR(0xFBFFD8)

  158.                                                                         $iColor2 = RGB2BGR(0x3DF8FF)

  159.                                                                         $hDC = DllStructGetData($tCustDraw, 'hdc')

  160.                                                                         If Mod($iItem, 2) Then

  161.                                                                         If Mod($iSubitem, 2) Then

  162.                                                                         DllStructSetData($tCustDraw, 'clrTextBk', $iColor1)

  163.                                                                         Else

  164.                                                                         DllStructSetData($tCustDraw, 'clrTextBk', $iColor2)

  165.                                                                         EndIf

  166.                                                                         DLLCall("gdi32.dll","hwnd","SelectObject", "hwnd", $hDC, "hwnd", $aFont1[0]) ;select our chosen font into DC

  167.                                                                         Else

  168.                                                                         If Mod($iSubitem, 2) Then

  169.                                                                         DllStructSetData($tCustDraw, 'clrTextBk', $iColor2)

  170.                                                                         Else

  171.                                                                         DllStructSetData($tCustDraw, 'clrTextBk', $iColor1)

  172.                                                                         EndIf

  173.                                                                         DLLCall("gdi32.dll","hwnd","SelectObject", "hwnd", $hDC, "hwnd", $aFont2[0])

  174.                                                                         EndIf

  175.                                                                 Case 20 To 29 ;for rows 21-30 lets do this

  176.                                                                         $iColor1 = RGB2BGR(0xFBFFD8)

  177.                                                                         $iColor2 = RGB2BGR(-1)

  178.                                                                         If Mod($iItem, 2) Then ;odd rows

  179.                                                                         DllStructSetData($tCustDraw, 'clrTextBk', $iColor2)

  180.                                                                         Else

  181.                                                                         DllStructSetData($tCustDraw, 'clrTextBk', $iColor1)

  182.                                                                         EndIf

  183.                                                         EndSwitch

  184.                                                         Return $CDRF_NEWFONT

  185.                                                 Case BitOR($CDDS_ITEMPOSTPAINT, $CDDS_SUBITEM)

  186.                                                        

  187.                                                 Case Else

  188.                                                        

  189.                                         EndSwitch

  190.             EndSwitch

  191.      EndSwitch

  192.     Return $GUI_RUNDEFMSG


  193.  

  194.  

  195. Func _SetchkedBkClr(ByRef $tCustDraw, ByRef $aDataArray, $ihighBkClr = 0xF7D3AD, $idefBkclr = 0xFFFFFF)

  196.     Local $iIndex = DllStructGetData($tCustDraw, "ItemSpec")

  197.     If $aDataArray[$iIndex][3] = 4096 Then

  198.         DllStructSetData($tCustDraw, "clrTextBk", $idefBkclr);BGR格式顏色值 默認背景色

  199.     Else

  200.         DllStructSetData($tCustDraw, "clrTextBk", $ihighBkClr);BGR格式顏色值 高亮背景色

  201.                 DllStructSetData($tCustDraw, "clrText", 0xFFFFFF) ;高亮後文字改為白色

  202.     EndIf


  203.  

  204.  

  205. Func _SetchkedBkClr2(ByRef $tCustDraw, ByRef $aDataArray, $ihighBkClr = 0xF7D3AD, $idefBkclr = 0xFFFFFF)

  206.                 Local $iIndex = DllStructGetData($tCustDraw, "ItemSpec")

  207.         DllStructSetData($tCustDraw, "clrTextBk", $ihighBkClr);BGR格式顏色值 高亮背景色

  208.                 DllStructSetData($tCustDraw, "clrText", 0xFFFFFF) ;高亮後文字改為白色

  209.  


  210.  

  211. Func _LVN_GETDISPINFO($hlst, $ilParam, ByRef $aDataArray)

  212.     If Not IsArray($aDataArray) Then Return

  213.     $tInfo = DllStructCreate($tagNMLVDISPINFO, $ilParam)

  214.     $iIndex = Int(DllStructGetData($tInfo, "Item"))

  215.     $iSub = Int(DllStructGetData($tInfo, "SubItem"))

  216.  

  217.     If BitAND(DllStructGetData($tInfo, "Mask"), $LVIF_IMAGE) And $iSub = 0 Then DllStructSetData($tInfo, "Image", 0);判斷是否有LVIF_IMAGE屬性,有則設置列圖像。不設置_GUICtrlListView_SetImageList則無

  218.  

  219.     If (BitAND(_GUICtrlListView_GetExtendedListViewStyle($hlst), $LVS_EX_CHECKBOXES) = $LVS_EX_CHECKBOXES) Then

  220.         ;===============設置核取方塊資訊

  221.         DllStructSetData($tInfo, "Mask", BitOR($LVIF_STATE, DllStructGetData($tInfo, "Mask")))

  222.         DllStructSetData($tInfo, "StateMask", $LVIS_STATEIMAGEMASK)

  223.         DllStructSetData($tInfo, "State", $aDataArray[$iIndex][3])

  224.     EndIf

  225.  

  226.     DllStructSetData($tText, "Text", $aDataArray[$iIndex][$iSub]);列資料放入$tText結構

  227.     DllStructSetData($tInfo, "Text", DllStructGetPtr($tText));$tText結構的指標來設置列資料

  228.     DllStructSetData($tInfo, "TextMax", StringLen($aDataArray[$iIndex][$iSub]));設置列資料字串長


  229.  

  230. Func RGB2BGR($iColor)

  231. Return BitAND(BitShift(String(Binary($iColor)), 8), 0xFFFFFF)


复制代码 高亮切换
附件: 您需要登录才可以下载或查看附件。没有帐号?加入

实测 貌似是第43行
$LVS_EX_DOUBLEBUFFER
这个样式发生了影响,原理我不懂。。。
  1. $hListView2 = GUICtrlCreateListView("$hListView2| | ", 100, 2, 295, 296, BitOR($LVS_REPORT, $LVS_SINGLESEL, $LVS_SHOWSELALWAYS, $LVS_OWNERDATA), $LVS_EX_GRIDLINES + $LVS_EX_FULLROWSELECT + $LVS_EX_DOUBLEBUFFER + $LVS_EX_CHECKBOXES)
  2. $hListView2 = GUICtrlCreateListView("$hListView2| | ", 100, 2, 295, 296, BitOR($LVS_REPORT, $LVS_SINGLESEL, $LVS_SHOWSELALWAYS, $LVS_OWNERDATA), $LVS_EX_GRIDLINES + $LVS_EX_FULLROWSELECT  + $LVS_EX_CHECKBOXES)
复制代码
i miss

TOP

回复 2# fenhanxue


    ㄟ  好像是ㄟ   可是 到底是為什麼  真搞不懂....

TOP

Return $CDRF_SKIPDEFAULT 这行取消注销就可以用原来的高亮效果

TOP

回复 4# yamakawa

我知道 可是我就是想換成自己定義的顏色  不想使用原來的

TOP

本帖最后由 kk_lee69 于 2017-8-10 15:37 编辑

回复 2# fenhanxue


    可以幫我一下嗎  變黑色的時候  那個複選框不見了   能否改成  複選框還在

附件: 您需要登录才可以下载或查看附件。没有帐号?加入

TOP

回复 6# kk_lee69


    今天手上有事,没空调试,,你说变黑色看不见复选框,那明显是矩形位置不对。。大概看了下。。

132行
  1. DllStructSetData($tRect, 1, 2)
复制代码
你试着把这个2设高点,,比如20.。

TOP

本帖最后由 kk_lee69 于 2017-8-10 16:17 编辑

回复 7# yamakawa

OK 就是他 啦   謝啦  就是找不到要改的位置  感謝!!

不過還還是不知道為何 加上 $LVS_EX_DOUBLEBUFFER風格就不行

不知道是否有解決方法

TOP

回复 7# yamakawa


    嗯,现在闲了,,有空了。。。
   看了下。。。。
  1.我也是把那个双缓冲干掉了。。。。具体原因不明,,之前碰到过
  2.要自定义颜色,你需要添加一个自定义笔刷,就像之前你的那帖子我说的那样。

     1.。132行
  1. DllCall('user32.dll', 'int', 'FillRect', 'ptr', $hDC, 'ptr', DllStructGetPtr($tRect), 'int', _WinAPI_GetStockObject(4))
复制代码
改为
  1. $hbrush = _WinAPI_CreateSolidBrush(0xff4e00);要自定义,所以创建自定义笔刷
  2.                                                                         DllCall('user32.dll', 'int', 'FillRect', 'ptr', $hDC, 'ptr', DllStructGetPtr($tRect), 'int', $hbrush);最后一个参数改成自定义笔刷
  3.                                                                         _WinAPI_DeleteObject($hbrush)
复制代码
142行修改为
  1.                                                                 _WinAPI_SetTextColor($hDC, 0xFFFFFF) ;字体颜色
复制代码
应该就能满足你的要求了吧

TOP

刚发现还有个图标被盖掉了。。。那个20你继续改吧。。。38?40左右应该就可以

TOP

回复 10# yamakawa

我改37 可以了  其他的 我再研究看看  謝啦

TOP

回复 11# kk_lee69


    闲的蛋疼,又看了一次代码。。。
   好像那个获取dc有问题。。你试着这样改看看
  1.           $hDC = DllStructGetData($tCustDraw, 'hdc')
复制代码

TOP

回复 11# kk_lee69


    用你的源码,改了这句,,可以用双缓冲了。。但是好像有其他问题。。前面图标没了。。看来需要自己添加了

TOP

应该可以吧

TOP

回复 13# yamakawa


    是阿 前面圖標  還是勾選的地方不見了   看來 還是原本那個 好像比較好些

TOP

返回列表