renxiaoyao 发表于 2010-7-24 01:25:14

【已解决】关于listview改变整列的底色

本帖最后由 renxiaoyao 于 2010-7-26 10:46 编辑

我按照netegg大大这个帖 http://www.autoitx.com/forum.php?mod=viewthread&tid=15686&highlight=listview 的例子,改写成了这样一个东东

head.au3Global $fListView, $fSubItemStart, $fSubItemEnd, $fSubItemBkClr

Func _GUICtrlListView_SetColumnBkClr($mListView, $mColumnStart, $mColumnEnd, $mColumnBkClr) ;传递listview,开始列,结束列,底色
        $fListView = $mListView
        $fSubItemStart = $mColumnStart
        $fSubItemEnd = $mColumnEnd
        $fSubItemBkClr = $mColumnBkClr
        GUIRegisterMsg($WM_NOTIFY, "fSetColumnBkClr")
EndFunc

Func RGB2BGR($iColor) ;RGB倒置
        Return BitAND(BitShift(String(Binary($iColor)), 8), 0xFFFFFF)
EndFunc   ;==>RGB2BGR()

Func fSetColumnBkClr($hWnd, $Msg, $wParam, $lParam) ;设置listview指定列底色
        Local $tNMHDR, $hWndFrom, $iCode
        $tNMHDR = DllStructCreate($tagNMHDR, $lParam)
        $hWndFrom = DllStructGetData($tNMHDR, "hWndFrom")
        $iCode = DllStructGetData($tNMHDR, "Code")
        Switch $hWndFrom
                Case $fListView
                        Switch $iCode
                                Case $NM_CUSTOMDRAW
                                        Local $tCustDraw = DllStructCreate($tagNMLVCUSTOMDRAW, $lParam)
                                        Local $iDrawStage = DllStructGetData($tCustDraw, "dwDrawStage")
                                        If $iDrawStage = $CDDS_PREPAINT Then Return $CDRF_NOTIFYITEMDRAW
                                        If $iDrawStage = $CDDS_ITEMPREPAINT Then Return $CDRF_NOTIFYSUBITEMDRAW
                                        Local $iSubItem = DllStructGetData($tCustDraw, "iSubItem")
                                        If $iSubItem = $fSubItemStart Then   ;设置子项, 即列索引大于fSubItemStart时
                                                DllStructSetData($tCustDraw, "clrTextBk", RGB2BGR($fSubItemBkClr));设置文本背景色
                                        ElseIf $iSubItem = $fSubItemEnd + 1 Then
                                                DllStructSetData($tCustDraw, "clrTextBk", RGB2BGR(Dec(StringMid(_GUICtrlListView_GetBkColor($fListView), 3)))) ;改回系统底色
                                        EndIf
                                        Return $CDRF_NEWFONT
                        EndSwitch
        EndSwitch
        Return $GUI_RUNDEFMSG
EndFunc   ;==>WM_NOTIFY当使用时_GUICtrlListView_Create和_GUICtrlListView_AddItem、_GUICtrlListView_AddSubItem来创建控件和项目时,是可以达到效果的:{:face (280):}
main.au3#include <GuiListView.au3>
#include "head.au3"

$hGUI = GUICreate("Test", 400, 200)
$ListTest = _GUICtrlListView_Create($hGUI, "Items|SubItems||", 10, 10, 380, 180, $LVS_REPORT, $WS_EX_CLIENTEDGE)
For $i = 1 To 10
    _GUICtrlListView_AddItem($ListTest, "Item|a|b" & $i)
    _GUICtrlListView_AddSubItem($ListTest, $i - 1, "SubItem" & $i, 1)
    _GUICtrlListView_AddSubItem($ListTest, $i - 1, "SubItemb" & $i, 2)
Next

_GUICtrlListView_SetColumnBkClr($ListTest, 1, 1, 0xFFFF80)

GUISetState()

Do
Until GUIGetMsg() = $GUI_EVENT_CLOSE

但是,当我改用GUICtrlCreateListView和GUICtrlCreateListViewItem来创建控件时,却没有效果{:face (319):}
main2.au3#include <GuiListView.au3>
#include "head.au3"

$hGUI = GUICreate("Test2", 400, 200)
$ListTest = GUICtrlCreateListView("Items|SubItems||", 0, 10, 380, 180, -1, BitOR($LVS_EX_GRIDLINES, $LVS_EX_FULLROWSELECT))
For $i = 1 To 10
        GUICtrlCreateListViewItem("Item" & $i & "|a|b", $ListTest)
Next

_GUICtrlListView_SetColumnBkClr($ListTest, 1, 1, 0xFFFF80)

GUISetState()

Do
Until GUIGetMsg() = $GUI_EVENT_CLOSE

请问怎样修改能使它生效呢?
另外,哪位能解答下,为什么两种方法做出来的表,字体大小都不一样了……
谢谢!
{:1_287:}

renxiaoyao 发表于 2010-7-24 23:44:29

{:face (245):}自己顶起

netegg 发表于 2010-7-26 01:10:21

GUICtrlCreateListView和GUICtrlCreateListViewItem创建控件的方式和udf不大一样,udf里是根据数据结构创建,所以可控制的项目很多

renxiaoyao 发表于 2010-7-26 01:20:43

本帖最后由 renxiaoyao 于 2010-7-26 01:21 编辑

{:face (207):}原来是这样,看来只有把程序全改了

谢谢大大的解答!

menfan1 发表于 2010-7-26 21:52:44

呵呵,学习一下。。

syhsieh 发表于 2012-2-9 16:27:36

最近正在弄 ListView 拜讀後有些小心得

試用後

不管是從 netegg 來的原始碼,或者是本文作者用的原始碼
可以從 column 0 -> n 那行的資料都可以改變

但是
若我只要單一 (column 1, Index 1) 則程式會將
該行 column 1 到 n 全部底色塗滿
無法我只要 column 1, Index 1 塗滿
需要處理 column 2 -> n 以後的底色
美中不足的地方

另外缺點
使用後,會將 GUICtrlSetColor 原先所著上去的顏色覆蓋掉

先用 GUICtrlSetColor 再用本文程式,不會馬上掉色,等你點選用 GUICtrlSetColor 上底色的欄位後,才會整行被清成原始底色
先用本文程式再用 GUICtrlSetColor,無法上底色,變成原始底色
所以
兩種方式,只能使用其中之一上色

殘念~~~
页: [1]
查看完整版本: 【已解决】关于listview改变整列的底色