找回密码
 加入
搜索
查看: 4514|回复: 5

[GUI管理] 【已解决】关于listview改变整列的底色

[复制链接]
发表于 2010-7-24 01:25:14 | 显示全部楼层 |阅读模式
本帖最后由 renxiaoyao 于 2010-7-26 10:46 编辑

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

head.au3
Global $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来创建控件和项目时,是可以达到效果的:
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来创建控件时,却没有效果
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金钱 +10 收起 理由
afan + 10 感谢主动将修改帖子分类为[已解决],请继续 ...

查看全部评分

 楼主| 发表于 2010-7-24 23:44:29 | 显示全部楼层
自己顶起
发表于 2010-7-26 01:10:21 | 显示全部楼层
GUICtrlCreateListView和GUICtrlCreateListViewItem创建控件的方式和udf不大一样,udf里是根据数据结构创建,所以可控制的项目很多

评分

参与人数 1威望 +2 收起 理由
afan + 2

查看全部评分

 楼主| 发表于 2010-7-26 01:20:43 | 显示全部楼层
本帖最后由 renxiaoyao 于 2010-7-26 01:21 编辑

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

谢谢大大的解答!
发表于 2010-7-26 21:52:44 | 显示全部楼层
呵呵,学习一下。。
发表于 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,無法上底色,變成原始底色
所以
兩種方式,只能使用其中之一上色

殘念~~~
您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-9-20 17:54 , Processed in 0.077199 second(s), 21 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表