sour 发表于 2011-11-23 14:07:01

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

本帖最后由 sour 于 2011-11-23 21:19 编辑

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

最后放弃了这个方法,太复杂麻烦了,而且创建的时候右键菜单都要重新写

netegg 发表于 2011-11-23 14:11:38

本帖最后由 netegg 于 2011-11-23 14:13 编辑

那个只是告诉你怎么改,不是告诉你怎么用,逻辑问题还是自己想想吧

sour 发表于 2011-11-23 14:14:16

if subitem你改成switch $subitem试试看
netegg 发表于 2011-11-23 14:11 http://www.autoitx.com/images/common/back.gif


谢谢原作者的回复
    我看不懂的地方是怎么把选择项目传递到这个样式中
   比如里面有个项目是1 我需要1的时候要变成红色,但是这个1怎么传递到WM_NOTIFY里面,我看不大明白....

netegg 发表于 2011-11-23 14:16:50

是项还是子项,背景还是内容

sour 发表于 2011-11-23 14:21:52

是项还是子项,背景还是内容
netegg 发表于 2011-11-23 14:16 http://www.autoitx.com/images/common/back.gif

整行的背景,项和子项一起改

sour 发表于 2011-11-23 14:23:32

条件是子项的内容作为条件,不过通过子项找项也挺容易写,我不知道怎么把他写在里面
如果有个例子是内容是1的一个颜色,内容是2的是一个颜色我就能明白了

netegg 发表于 2011-11-23 14:29:43

本帖最后由 netegg 于 2011-11-23 14:30 编辑

看这个帖子,那个不适合这个问题
http://www.autoitx.com/thread-15521-1-1.html
条件好好想想,无非是确定$item的事

sour 发表于 2011-11-23 14:34:30

这个帖子我也看了
颜色选择是用_GUICtrlListView_GetItemChecked这个来判断的,如果checked然后变颜色
如果硬要套上去,我只有再加列,把满足条件的checked变成ture..这个好像绕的有点远
我再看看怎么改这个例子的条件把那个筛选出来,谢谢

sour 发表于 2011-11-23 14:41:11

我原来的代码是这样的
其实很简单的,但是如果用_GUICtrlListView_AddItem就不知道该如何做了
                $item_PM = GUICtrlCreateListViewItem($aRow & "|" & $pmdate & "|" & $aRow & "|" & $list_PM & "|" & $list_PM & "±" & $list_PM & "|" & $list_PM & "|" & $list_PM & "|" & $list_PM & "|" & $list_PM & "|" & $list_PM & "|" & $list_PM & "|" & $list_PM & "|" & $list_PM & "|" & $list_PM & "|" & $list_PM & "|" & $aRow, $ListView3)
                Select
                                Case $aRow="on-going"
                                GUICtrlSetBkColor($item_PM, 0XFFBBFF)
                        Case $aRow="fail"
                                GUICtrlSetBkColor($item_PM, 0XFF4500)
                Case $aRow="close"
                                GUICtrlSetBkColor($item_PM, 0x38F709)
                EndSelect

sour 发表于 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()

sour 发表于 2011-11-23 15:16:56

成功倒是成功了,不过速度非常缓慢,显示一行需要1s时间

netegg 发表于 2011-11-23 15:25:14

本帖最后由 netegg 于 2011-11-23 15:26 编辑

字体设置去掉,子项去掉,只设置项目,另外,是什么引起的速度慢,不一定是颜色设置的问题,有可能是查找匹配子项的事情

sour 发表于 2011-11-23 18:54:54

我最后还是放弃这样的方式了

bdancerlc 发表于 2011-11-23 20:26:18

最近也用到 listview,先关注此帖..

menfan1 发表于 2011-11-23 20:32:39

多搜索就知道啦,我以前也是这么写的哈
页: [1] 2
查看完整版本: Listview怎么在使用_AddItem下面改变背景颜色(已解决)