找回密码
 加入
搜索
查看: 6406|回复: 18

[AU3基础] Listview怎么在使用_AddItem下面改变背景颜色(已解决)

  [复制链接]
发表于 2011-11-23 14:07:01 | 显示全部楼层 |阅读模式
本帖最后由 sour 于 2011-11-23 21:19 编辑

我搜索半天只有这个帖子能在这个情况下改变颜色
http://www.autoitx.com/forum.php ... ght=listview%283%29
但是怎么样简单的改变,比如符合条件的改变颜色不符合的不改变...
这个帖子里面只能指定行改变....
如果用GUICtrlCreateListViewItem可以很方便的改变颜色,但是用这个方式如果item过多
下一个listview就会出错,读取不到选择项,我测试了很久才发现的。

最后放弃了这个方法,太复杂麻烦了,而且创建的时候右键菜单都要重新写
发表于 2011-11-23 14:11:38 | 显示全部楼层
本帖最后由 netegg 于 2011-11-23 14:13 编辑

那个只是告诉你怎么改,不是告诉你怎么用,逻辑问题还是自己想想吧
 楼主| 发表于 2011-11-23 14:14:16 | 显示全部楼层
if subitem你改成switch $subitem试试看
netegg 发表于 2011-11-23 14:11



谢谢原作者的回复
    我看不懂的地方是怎么把选择项目传递到这个样式中
   比如里面有个项目是1 我需要1的时候要变成红色,但是这个1怎么传递到WM_NOTIFY里面,我看不大明白....
发表于 2011-11-23 14:16:50 | 显示全部楼层
是项还是子项,背景还是内容
 楼主| 发表于 2011-11-23 14:21:52 | 显示全部楼层
是项还是子项,背景还是内容
netegg 发表于 2011-11-23 14:16


整行的背景,项和子项一起改
 楼主| 发表于 2011-11-23 14:23:32 | 显示全部楼层
条件是子项的内容作为条件,不过通过子项找项也挺容易写,我不知道怎么把他写在里面
如果有个例子是内容是1的一个颜色,内容是2的是一个颜色我就能明白了
发表于 2011-11-23 14:29:43 | 显示全部楼层
本帖最后由 netegg 于 2011-11-23 14:30 编辑

看这个帖子,那个不适合这个问题
http://www.autoitx.com/thread-15521-1-1.html
条件好好想想,无非是确定$item的事
 楼主| 发表于 2011-11-23 14:34:30 | 显示全部楼层
这个帖子我也看了
颜色选择是用_GUICtrlListView_GetItemChecked这个来判断的,如果checked然后变颜色
如果硬要套上去,我只有再加列,把满足条件的checked变成ture..这个好像绕的有点远
我再看看怎么改这个例子的条件把那个筛选出来,谢谢
 楼主| 发表于 2011-11-23 14:41:11 | 显示全部楼层
我原来的代码是这样的
其实很简单的,但是如果用_GUICtrlListView_AddItem就不知道该如何做了
                $item_PM = GUICtrlCreateListViewItem($aRow[0] & "|" & $pmdate & "|" & $aRow[5] & "|" & $list_PM[3] & "|" & $list_PM[4] & "±" & $list_PM[5] & "|" & $list_PM[6] & "|" & $list_PM[7] & "|" & $list_PM[8] & "|" & $list_PM[9] & "|" & $list_PM[10] & "|" & $list_PM[11] & "|" & $list_PM[14] & "|" & $list_PM[16] & "|" & $list_PM[18] & "|" & $list_PM[12] & "|" & $aRow[4], $ListView3)
                Select
                                Case $aRow[4]="on-going"
                                GUICtrlSetBkColor($item_PM, 0XFFBBFF)
                        Case $aRow[4]="fail"
                                GUICtrlSetBkColor($item_PM, 0XFF4500)
                Case $aRow[4]="close"
                                GUICtrlSetBkColor($item_PM, 0x38F709)
                EndSelect
 楼主| 发表于 2011-11-23 14:51:49 | 显示全部楼层
只好这样凑合着用了
#include <GuiConstantsEx.au3>
#include <WindowsConstants.au3>
#include <GuiListView.au3>
#include <FontConstants.au3>
#include <WinAPI.au3>

Global Const $CDDS_SUBITEMPREPAINT = BitOR($CDDS_ITEM, $CDDS_SUBITEM, $CDDS_PREPAINT)

Global $Font1 = _WinAPI_CreateFont(14, 0, 0, 0, $FW_BOLD)
Global $Font2 = _WinAPI_CreateFont(14, 0, 0, 0, $FW_NORMAL, False, False, False, $DEFAULT_CHARSET, $OUT_DEFAULT_PRECIS, _
                                   $CLIP_DEFAULT_PRECIS, $DEFAULT_QUALITY, 0, "MS Sans Serif")

$hGUI = GUICreate("Test", 300, 200)

$hListView = _GUICtrlListView_Create($hGUI, "Items|SubItems|", 10, 10, 280, 180, $LVS_REPORT, $WS_EX_CLIENTEDGE)

_GUICtrlListView_SetExtendedListViewStyle($hListView, BitOR($LVS_EX_GRIDLINES, $LVS_EX_FULLROWSELECT, $LVS_EX_INFOTIP))

For $i = 1 To 10
    _GUICtrlListView_AddItem($hListView, "Item" & $i)
    _GUICtrlListView_AddSubItem($hListView, $i - 1, "SubItem" & $i, 1)
    _GUICtrlListView_AddSubItem($hListView, $i - 1, "SubItem" & $i, 2)
Next

GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY")

GUISetState()

Do
Until GUIGetMsg() = $GUI_EVENT_CLOSE

_WinAPI_DeleteObject($Font1)
_WinAPI_DeleteObject($Font2)

Func WM_NOTIFY($hWnd, $Msg, $wParam, $lParam)
    Local $tNMHDR, $hWndFrom, $iCode
    $tNMHDR = DllStructCreate($tagNMHDR, $lParam)
    $hWndFrom = DllStructGetData($tNMHDR, "hWndFrom")
    $iCode = DllStructGetData($tNMHDR, "Code")
    Switch $hWndFrom
        Case $hListView
            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")
                    Local $iItem = DllStructGetData($tCustDraw, "dwItemSpec")
                    Local $iColor, $hDC
                                        $iI = _GUICtrlListView_FindText($hListView, "item4")
                    Switch $iItem
                        Case $iI
                            $hDC = DllStructGetData($tCustDraw, "hdc")
                            If $iSubItem = 0 Then         ;设置首列, 即项目
                                $iColor = RGB2BGR(0xFF0000)                                 
                                _WinAPI_SelectObject($hDC, $Font1)
                                DllStructSetData($tCustDraw, "clrText", $iColor)
                            ElseIf $iSubItem = 1 Then   ;设置子项, 即列索引大于0时
                                $iColor = RGB2BGR(0x000000)
                                _WinAPI_SelectObject($hDC, $Font2)  ;设置用于设备场景内文本的字体
                                DllStructSetData($tCustDraw, "clrText", $iColor)  ;设置文本色
                                DllStructSetData($tCustDraw, "clrTextBk", RGB2BGR(0xFFFF80))  ;设置文本背景色
                            ElseIf $iSubItem = 2 Then
                                $iColor = RGB2BGR(0x008080)
                                _WinAPI_SelectObject($hDC, $Font1)
                                DllStructSetData($tCustDraw, "clrText", $iColor)
                                DllStructSetData($tCustDraw, "clrTextBk", RGB2BGR(0xFFFFFF))
                            EndIf
                            Return $CDRF_NEWFONT
                    EndSwitch
            EndSwitch
    EndSwitch
    Return $GUI_RUNDEFMSG
EndFunc   ;==>WM_NOTIFY

Func RGB2BGR($iColor)
    Return BitAND(BitShift(String(Binary($iColor)), 8), 0xFFFFFF)
EndFunc   ;==>RGB2BGR()
 楼主| 发表于 2011-11-23 15:16:56 | 显示全部楼层
成功倒是成功了,不过速度非常缓慢,显示一行需要1s时间
发表于 2011-11-23 15:25:14 | 显示全部楼层
本帖最后由 netegg 于 2011-11-23 15:26 编辑

字体设置去掉,子项去掉,只设置项目,另外,是什么引起的速度慢,不一定是颜色设置的问题,有可能是查找匹配子项的事情
 楼主| 发表于 2011-11-23 18:54:54 | 显示全部楼层
我最后还是放弃这样的方式了
发表于 2011-11-23 20:26:18 | 显示全部楼层
最近也用到 listview,先关注此帖..
发表于 2011-11-23 20:32:39 | 显示全部楼层
多搜索就知道啦,我以前也是这么写的哈
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2024-10-1 07:31 , Processed in 0.117936 second(s), 23 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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