vigiles 发表于 2014-2-19 17:10:41

【已解决】ListView的$GUI_BKCOLOR_LV_ALTERNATE标识如何使用?

本帖最后由 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
请指教!

afan 发表于 2014-2-19 19:06:01

$GUI_BKCOLOR_LV_ALTERNATE 不是那样用的,直接用 GUICtrlSetBKColor($lvDataResult, $GUI_BKCOLOR_LV_ALTERNATE)
再 GUICtrlSetBKColor($lvDataResult, ListView的背景色)
之后在创建Item时再GUICtrlSetBKColor()设置一个色

seniors 发表于 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

vigiles 发表于 2014-2-19 21:40:41

$GUI_BKCOLOR_LV_ALTERNATE 不是那样用的,直接用 GUICtrlSetBKColor($lvDataResult, $GUI_BKCOLOR_LV_ALTE ...
afan 发表于 2014-2-19 19:06 http://www.autoitx.com/images/common/back.gif


seniors 发表于 2014-2-19 19:08 http://www.autoitx.com/images/common/back.gif

_____________________________________________________________________________________________________

感谢两位!
现在我根据论坛里的代码实现了奇偶行着色,但是排序后选中列就没有着色了,如图中列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 = ["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;int")
      DllStructSetData($stLvfi, 1, $LVFI_PARAM)
      DllStructSetData($stLvfi, 3, $nItemID)
      Local $stBuffer = DllStructCreate("char")
      $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

请指教!

seniors 发表于 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 = ["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

vigiles 发表于 2014-2-20 11:39:40

本帖最后由 vigiles 于 2014-2-20 11:51 编辑


seniors 发表于 2014-2-20 10:04 http://www.autoitx.com/images/common/back.gif

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

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

afan 发表于 2014-2-20 11:59:51

回复 6# vigiles


    _GUICtrlListView_UnRegisterSortCallBack() 应该移到 Exit 上面

vigiles 发表于 2014-2-20 13:19:50

本帖最后由 vigiles 于 2014-2-20 13:26 编辑

回复 7# afan



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

seniors 发表于 2014-2-20 18:08:18

_GUICtrlListView_RegisterSortCallBack($lvDataResult, ture,false)

vigiles 发表于 2014-2-20 22:33:45

_GUICtrlListView_RegisterSortCallBack($lvDataResult, ture,false)
seniors 发表于 2014-2-20 18:08 http://www.autoitx.com/images/common/back.gif

我知道这个方法第三个参数可以配置。我想要的是单独在某个时刻可以即时隐藏箭头,看了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[$iLListViewSortInfoSize]

        $aListViewSortInfo = UBound($aListViewSortInfo) - 1
        Local $iIndex = $aListViewSortInfo

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

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

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

请指教

seniors 发表于 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
把这一段改造成你所需要的吧

vigiles 发表于 2014-2-21 17:11:43

看这个函数_GUICtrlListView_SortItems

把这一段改造成你所需要的吧
seniors 发表于 2014-2-21 06:59 http://www.autoitx.com/images/common/back.gif


    非常感谢,已经使用GuiHeader.au3实现

alaws 发表于 2014-3-3 23:01:47

看afan一说 貌似明白了
页: [1]
查看完整版本: 【已解决】ListView的$GUI_BKCOLOR_LV_ALTERNATE标识如何使用?