【已解决】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
请指教! $GUI_BKCOLOR_LV_ALTERNATE 不是那样用的,直接用 GUICtrlSetBKColor($lvDataResult, $GUI_BKCOLOR_LV_ALTERNATE)
再 GUICtrlSetBKColor($lvDataResult, ListView的背景色)
之后在创建Item时再GUICtrlSetBKColor()设置一个色 #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 $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
请指教! #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:51 编辑
seniors 发表于 2014-2-20 10:04 http://www.autoitx.com/images/common/back.gif
非常感谢!
但还有一点不明白:
_GUICtrlListView_UnRegisterSortCallBack在API文档中的解释是“注销列表视图排序回调函数.”,能否具体讲讲?它所在位置有何限制?它好像不是必须的。 回复 6# vigiles
_GUICtrlListView_UnRegisterSortCallBack() 应该移到 Exit 上面 本帖最后由 vigiles 于 2014-2-20 13:26 编辑
回复 7# afan
请问有什么办法可以把列标题的选择状态和箭头去掉吗? _GUICtrlListView_RegisterSortCallBack($lvDataResult, ture,false) _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
请指教 看这个函数_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
把这一段改造成你所需要的吧 看这个函数_GUICtrlListView_SortItems
把这一段改造成你所需要的吧
seniors 发表于 2014-2-21 06:59 http://www.autoitx.com/images/common/back.gif
非常感谢,已经使用GuiHeader.au3实现 看afan一说 貌似明白了
页:
[1]