找回密码
 加入
搜索
查看: 8684|回复: 12

[GUI管理] 【已解决】ListView的$GUI_BKCOLOR_LV_ALTERNATE标识如何使用?

  [复制链接]
发表于 2014-2-19 17:10:41 | 显示全部楼层 |阅读模式
本帖最后由 vigiles 于 2014-2-21 17:21 编辑


想实现奇偶行的不同着色。
开发文档中仅提到了$GUI_BKCOLOR_LV_ALTERNATE,但没有代码示例。
#include <ListViewConstants.au3>
#include <GUIConstantsEx.au3>

AutoItSetOption("GUIOnEventMode", 1)

$hGUI = GUICreate("Test", 300, 200)
        GUISetOnEvent($GUI_EVENT_CLOSE, "funcGUISetOnEvent")

        $lvDataResult = GUICtrlCreateListView("Column1|Col2|Col3|Col4|Col5", 10, 10, 280, 180, BitOR($LVS_SHOWSELALWAYS, $LVS_REPORT));加上这个 $GUI_BKCOLOR_LV_ALTERNATE 就不显示!
                GUICtrlSetBkColor ($lvDataResult, 0xff66aa )        ;设置背景色

                GUICtrlCreateListViewItem("ABC|666|10.05.2004|0483|dslfgshdl", $lvDataResult)
                GUICtrlCreateListViewItem("DEF|5|11.05.2005|98788945|两个结论", $lvDataResult)
                GUICtrlCreateListViewItem("XYZ|31|12.05.2004|dsg|呵呵楼上的", $lvDataResult)
GUISetState()

While 1
WEnd

Func funcGUISetOnEvent()
        Exit
EndFunc
请指教!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?加入

×
发表于 2014-2-19 19:06:01 | 显示全部楼层
$GUI_BKCOLOR_LV_ALTERNATE 不是那样用的,直接用 GUICtrlSetBKColor($lvDataResult, $GUI_BKCOLOR_LV_ALTERNATE)
再 GUICtrlSetBKColor($lvDataResult, ListView的背景色)
之后在创建Item时再GUICtrlSetBKColor()设置一个色
发表于 2014-2-19 19:08:58 | 显示全部楼层
#include <ListViewConstants.au3>
#include <GUIConstantsEx.au3>

AutoItSetOption("GUIOnEventMode", 1)

$hGUI = GUICreate("Test", 300, 200)
        GUISetOnEvent($GUI_EVENT_CLOSE, "funcGUISetOnEvent")

        $lvDataResult = GUICtrlCreateListView("Column1|Col2|Col3|Col4|Col5", 10, 10, 280, 180, BitOR($LVS_SHOWSELALWAYS, $LVS_REPORT));加上这个 $GUI_BKCOLOR_LV_ALTERNATE 就不显示!
                                GUICtrlSetBkColor($lvDataResult, 0xeeeeee )        ;设置listview的背景色
                                GUICtrlSetBkColor($lvDataResult, $GUI_BKCOLOR_LV_ALTERNATE) ;奇数行为listview的背景色,偶数行为listviewitem的背景色
                                
                GUICtrlCreateListViewItem("ABC|666|10.05.2004|0483|dslfgshdl", $lvDataResult)
                                GUICtrlSetBkColor (-1, 0xcccccc );设置listviewitem的背景色
                GUICtrlCreateListViewItem("DEF|5|11.05.2005|98788945|两个结论", $lvDataResult)
                                GUICtrlSetBkColor (-1, 0xcccccc );设置listviewitem的背景色
                GUICtrlCreateListViewItem("XYZ|31|12.05.2004|dsg|呵呵楼上的", $lvDataResult)
                                GUICtrlSetBkColor (-1, 0xcccccc );设置listviewitem的背景色
GUISetState()

While 1
WEnd

Func funcGUISetOnEvent()
        Exit
EndFunc
 楼主| 发表于 2014-2-19 21:40:41 | 显示全部楼层
$GUI_BKCOLOR_LV_ALTERNATE 不是那样用的,直接用 GUICtrlSetBKColor($lvDataResult, $GUI_BKCOLOR_LV_ALTE ...
afan 发表于 2014-2-19 19:06

seniors 发表于 2014-2-19 19:08


_____________________________________________________________________________________________________

感谢两位!
现在我根据论坛里的代码实现了奇偶行着色,但是排序后选中列就没有着色了,如图中列2,如何使其着色不受影响?
#include <ColorConstants.au3>        ;背景颜色
#include <GUIConstantsEx.au3>        ;窗体
#include <ListViewConstants.au3>        ;列表
#include <WindowsConstants.au3>                ;窗体

AutoItSetOption("GUIOnEventMode", 1)

Dim $nCurCol = -1
Dim $nSortDir = 1
Dim $bSet = 0
Dim $nCol = -1

Global Const $LVM_GETITEM = $LVM_FIRST + 5

Dim $aItemData[10] = ["ABC|666|10.05.2004|vn|dslfgshdl", _
                                  "DEF|5|11.05.2005|yio|两个结论", _
                                  "XYZ|31|12.05.2004|kjdfh|呵呵楼上的", _
                                  "XYZ|22|12.05.2004|dsg|呵呵楼上的", _
                                  "XYZ|45|12.05.2004|sda|呵呵楼上的", _
                                  "XYZ|56|12.05.2004|cxvb|呵呵楼上的", _
                                  "XYZ|765|12.05.2004|gfj|呵呵楼上的", _
                                  "XYZ|54|12.05.2004|dsg|呵呵楼上的", _
                                  "XYZ|34|12.05.2004|xvcz|呵呵楼上的", _
                                  "XYZ|98|12.05.2004|weyt|呵呵楼上的"]

$hGUI = GUICreate("Test", 300, 200)
        GUISetOnEvent($GUI_EVENT_CLOSE, "funcGUISetOnEvent")

        $lvDataResult = GUICtrlCreateListView("列1|列2|列3|列4|列5", 10, 10, 280, 180, BitOR($LVS_SHOWSELALWAYS, $LVS_REPORT))
                GUICtrlSetBkColor($lvDataResult, 0xFFFFFF)
                GUICtrlSetBkColor($lvDataResult, $GUI_BKCOLOR_LV_ALTERNATE)
                GUICtrlSetOnEvent($lvDataResult, "funcListViewClick")
                GUICtrlRegisterListViewSort($lvDataResult, "funcListViewSrot")

        funcCreateItem()

GUISetState()

While 1
WEnd

Func funcCreateItem()
        For $i = 0 To UBound($aItemData) - 1
                GUICtrlCreateListViewItem($aItemData[$i], $lvDataResult)
                        GUICtrlSetBkColor (-1, 0xFFA500 );设置listviewitem的背景色
        Next
EndFunc

Func funcListViewClick()
        $bSet = 0
        $nCurCol = $nCol
        GUICtrlSendMsg($lvDataResult, $LVM_SETSELECTEDCOLUMN, GUICtrlGetState($lvDataResult), 0)
        ;         文件          返回类型    调用函数          "类型 1=窗口句柄 (指针)"     参数 1                            类型 n"    参数n
        DllCall("user32.dll",    "int",     "InvalidateRect", "hwnd",                      GUICtrlGetHandle($lvDataResult), "int",    0,        "int",    1)
        ;InvalidateRect:向指定的窗体更新区域添加一个矩形,并重新绘制
EndFunc

;自定义的回调函数(listview控件ID, 第一个项目的lParam值-默认为该项目的控件ID, 第二个项目的lParam值-默认为该项目的控件ID, 点击排序的列)
Func funcListViewSrot($hWnd, $nItem1, $nItem2, $nColumn)
        Local $nSort
        ;切换排序方向
        If $nColumn = $nCurCol Then
                If Not $bSet Then
                        $nSortDir = $nSortDir * - 1
                        $bSet = 1
                EndIf
        Else
                $nSortDir = 1
                EndIf

        $nCol = $nColumn
        $val1 = GetSubItemText($lvDataResult, $nItem1, $nColumn)
        $val2 = GetSubItemText($lvDataResult, $nItem2, $nColumn)

        ;如果是第3列(开始于0)那么对比数据
        If $nColumn = 2 Then
                $val1 = StringRight($val1, 4) & StringMid($val1, 4, 2) & StringLeft($val1, 2)
                $val2 = StringRight($val2, 4) & StringMid($val2, 4, 2) & StringLeft($val2, 2)
                EndIf

        $nResult = 0 ;item1和item2位置未改变
        $val_1 = Number($val1)

        If $val_1 = 0 Then $val_1 = $val1

        $val_2 = Number($val2)

        If $val_2 = 0 Then $val_2 = $val2

        If $val_1 < $val_2 Then
                $nResult = -1 ;把item2放在item1前面
        ElseIf $val_1 > $val_2 Then
                $nResult = 1 ;把item2放在item1后面
                EndIf

        $nResult = $nResult * $nSortDir

        Return $nResult
EndFunc   ;==>LVSort

;检索指定列的单元格文本
Func GetSubItemText($nCtrlID, $nItemID, $nColumn)
        Local $stLvfi = DllStructCreate("uint;ptr;int;int[2];int")
        DllStructSetData($stLvfi, 1, $LVFI_PARAM)
        DllStructSetData($stLvfi, 3, $nItemID)
        Local $stBuffer = DllStructCreate("char[260]")
        $nIndex = GUICtrlSendMsg($nCtrlID, $LVM_FINDITEM, -1, DllStructGetPtr($stLvfi));
        Local $stLvi = DllStructCreate("uint;int;int;uint;uint;ptr;int;int;int;int")
        DllStructSetData($stLvi, 1, $LVIF_TEXT)
        DllStructSetData($stLvi, 2, $nIndex)
        DllStructSetData($stLvi, 3, $nColumn)
        DllStructSetData($stLvi, 6, DllStructGetPtr($stBuffer))
        DllStructSetData($stLvi, 7, 260)
        GUICtrlSendMsg($nCtrlID, $LVM_GETITEM, 0, DllStructGetPtr($stLvi));
        $sItemText = DllStructGetData($stBuffer, 1)
        $stLvi = 0
        $stLvfi = 0
        $stBuffer = 0
        Return $sItemText
EndFunc   ;==>GetSubItemText

Func funcGUISetOnEvent()
        Exit
EndFunc
请指教!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?加入

×
发表于 2014-2-20 10:04:07 | 显示全部楼层
#include <ColorConstants.au3>        ;背景颜色
#include <GUIConstantsEx.au3>        ;窗体
#include <ListViewConstants.au3>        ;列表
#include <WindowsConstants.au3>                ;窗体
#include <GuiListView.au3>
AutoItSetOption("GUIOnEventMode", 1)

Dim $aItemData[10] = ["ABC|666|10.05.2004|vn|dslfgshdl", _
                "DEF|5|11.05.2005|yio|两个结论", _
                "XYZ|31|12.05.2004|kjdfh|呵呵楼上的", _
                "XYZ|22|12.05.2004|dsg|呵呵楼上的", _
                "XYZ|45|12.05.2004|sda|呵呵楼上的", _
                "XYZ|56|12.05.2004|cxvb|呵呵楼上的", _
                "XYZ|765|12.05.2004|gfj|呵呵楼上的", _
                "XYZ|54|12.05.2004|dsg|呵呵楼上的", _
                "XYZ|34|12.05.2004|xvcz|呵呵楼上的", _
                "XYZ|98|12.05.2004|weyt|呵呵楼上的"]

$hGUI = GUICreate("Test", 300, 200)
GUISetOnEvent($GUI_EVENT_CLOSE, "funcGUISetOnEvent")

$lvDataResult = GUICtrlCreateListView("列1|列2|列3|列4|列5", 10, 10, 280, 180, BitOR($LVS_SHOWSELALWAYS, $LVS_REPORT))

GUICtrlSetBkColor($lvDataResult, 0xFFFFFF)
GUICtrlSetBkColor($lvDataResult, $GUI_BKCOLOR_LV_ALTERNATE)
_GUICtrlListView_RegisterSortCallBack($lvDataResult)
GUICtrlSetOnEvent($lvDataResult, "funcListViewClick")

funcCreateItem()

GUISetState()

While 1
        Sleep(100)
WEnd
_GUICtrlListView_UnRegisterSortCallBack($lvDataResult)

Func funcCreateItem()
        For $i = 0 To UBound($aItemData) - 1
                GUICtrlCreateListViewItem($aItemData[$i], $lvDataResult)
                GUICtrlSetBkColor(-1, 0xFFA500);设置listviewitem的背景色
        Next
EndFunc   ;==>funcCreateItem

Func funcListViewClick()
        _GUICtrlListView_SortItems($lvDataResult, GUICtrlGetState($lvDataResult))
EndFunc   ;==>funcListViewClick

Func funcGUISetOnEvent()
        Exit
EndFunc   ;==>funcGUISetOnEvent
 楼主| 发表于 2014-2-20 11:39:40 | 显示全部楼层
本帖最后由 vigiles 于 2014-2-20 11:51 编辑
seniors 发表于 2014-2-20 10:04


非常感谢!
但还有一点不明白:

_GUICtrlListView_UnRegisterSortCallBack在API文档中的解释是“注销列表视图排序回调函数.”,能否具体讲讲?它所在位置有何限制?它好像不是必须的。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?加入

×
发表于 2014-2-20 11:59:51 | 显示全部楼层
回复 6# vigiles


    _GUICtrlListView_UnRegisterSortCallBack() 应该移到 Exit 上面
 楼主| 发表于 2014-2-20 13:19:50 | 显示全部楼层
本帖最后由 vigiles 于 2014-2-20 13:26 编辑

回复 7# afan



请问有什么办法可以把列标题的选择状态和箭头去掉吗?

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?加入

×
发表于 2014-2-20 18:08:18 | 显示全部楼层
_GUICtrlListView_RegisterSortCallBack($lvDataResult, ture,false)
 楼主| 发表于 2014-2-20 22:33:45 | 显示全部楼层
_GUICtrlListView_RegisterSortCallBack($lvDataResult, ture,false)
seniors 发表于 2014-2-20 18:08


我知道这个方法第三个参数可以配置。我想要的是单独在某个时刻可以即时隐藏箭头,看了GuiListView.au3源码,似乎没有单独的方法实现:
Func _GUICtrlListView_RegisterSortCallBack($hWnd, $fNumbers = True, $fArrows = True)
        If Not IsHWnd($hWnd) Then $hWnd = GUICtrlGetHandle($hWnd)

        Local $hHeader = _GUICtrlListView_GetHeader($hWnd)

        ReDim $aListViewSortInfo[UBound($aListViewSortInfo) + 1][$iLListViewSortInfoSize]

        $aListViewSortInfo[0][0] = UBound($aListViewSortInfo) - 1
        Local $iIndex = $aListViewSortInfo[0][0]

        $aListViewSortInfo[$iIndex][1] = $hWnd ; Handle/ID of listview

        $aListViewSortInfo[$iIndex][2] = _
                        DllCallbackRegister("__GUICtrlListView_Sort", "int", "int;int;hwnd") ; Handle of callback
        $aListViewSortInfo[$iIndex][3] = -1 ; $nColumn
        $aListViewSortInfo[$iIndex][4] = -1 ; nCurCol
        $aListViewSortInfo[$iIndex][5] = 1 ; $nSortDir
        $aListViewSortInfo[$iIndex][6] = -1 ; $nCol
        $aListViewSortInfo[$iIndex][7] = 0 ; $bSet
        $aListViewSortInfo[$iIndex][8] = $fNumbers ; Treat as numbers?
        $aListViewSortInfo[$iIndex][9] = $fArrows ; Use arrows in the header of the columns?
        $aListViewSortInfo[$iIndex][10] = $hHeader ; Handle to the Header

        Return $aListViewSortInfo[$iIndex][2] <> 0
EndFunc   ;==>_GUICtrlListView_RegisterSortCallBack

请指教
发表于 2014-2-21 06:59:23 | 显示全部楼层
看这个函数_GUICtrlListView_SortItems
For $x = 0 To _GUICtrlHeader_GetItemCount($hHeader) - 1
                                $iFormat = _GUICtrlHeader_GetItemFormat($hHeader, $x)
                                If BitAND($iFormat, $HDF_SORTDOWN) Then
                                        _GUICtrlHeader_SetItemFormat($hHeader, $x, BitXOR($iFormat, $HDF_SORTDOWN))
                                ElseIf BitAND($iFormat, $HDF_SORTUP) Then
                                        _GUICtrlHeader_SetItemFormat($hHeader, $x, BitXOR($iFormat, $HDF_SORTUP))
                                EndIf
                        Next

把这一段改造成你所需要的吧
 楼主| 发表于 2014-2-21 17:11:43 | 显示全部楼层
看这个函数_GUICtrlListView_SortItems

把这一段改造成你所需要的吧
seniors 发表于 2014-2-21 06:59



    非常感谢,已经使用GuiHeader.au3实现
发表于 2014-3-3 23:01:47 | 显示全部楼层
看afan一说 貌似明白了
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2024-11-15 10:54 , Processed in 0.102333 second(s), 24 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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