ListView控件Windows API-CheckAll-CheckCount?
我有一个VB6项目,我正在从使用列表框切换到使用列表视图。列表具有复选框样式。我正在查找要发送到ListView的Windows API消息,该消息指定:ListView控件Windows API-CheckAll-CheckCount?,listview,vb6,Listview,Vb6,我有一个VB6项目,我正在从使用列表框切换到使用列表视图。列表具有复选框样式。我正在查找要发送到ListView的Windows API消息,该消息指定: 全部检查 全部取消选中 支票计数 这对于列表框来说很容易,因为选中的与选中的内容相同。对于ListView,这不是真的 除了选中未选中之外,其他类似于此的内容: Private Const LVM_FIRST As Long = &H1000 Private Const LVM_GETITEMCOUNT As Long = (LV
- 全部检查
- 全部取消选中
- 支票计数
Private Const LVM_FIRST As Long = &H1000
Private Const LVM_GETITEMCOUNT As Long = (LVM_FIRST + 4)
Private Const LVM_GETSELECTEDCOUNT As Long = (LVM_FIRST + 50)
Private Const LV_SETSEL = &H1000 + 43
Private Function ListViewSelectedCount(ByRef LV As ListView) As Long
ListViewSelectedCount = SendMessage(LV.hwnd, LVM_GETSELECTEDCOUNT, 0, 0)
End Function
Private Sub ListViewSelectAll(ThisBox As ListView)
Dim LV As LV_ITEM
LV.mask = &H8
LV.State = True
LV.stateMask = &H2
Call SendMessage(ThisBox.hwnd, LV_SETSEL, ByVal -1, LV)
End Sub
我确实找到了ListView消息的列表:
但似乎没有什么是我所需要的。您是否有理由必须使用Windows API消息来设置所选标志。我假设您使用的是Microsoft Windows通用控件中的ListView。如果是,则可以使用以下代码:
Public Sub SetSelected(ByVal blnCheck As Boolean)
Dim lviItem As ListItem
For Each lviItem In ListView.ListItems
lviItem.Checked = blnCheck
Next
Set lviItem = Nothing
End Sub
Public Function CountChecked() As Long
Dim lngCount As Long
Dim lviItem As ListItem
For Each lviItem In ListView.ListItems
If lviItem.Checked Then
lngCount = lngCount + 1
End If
Next
Set lviItem = Nothing
CountChecked = lngCount
End Function
使用true或false调用SetSelected并选择/取消选择all,第二个函数将返回计数。您应该将代码的ListView位重命名为ListView的名称。如果希望使其更通用,可以将listview传递到子函数和函数中,该代码如下所示:
Public Sub SetSelected(ByRef lvwToChange As ListView, ByVal blnCheck As Boolean)
Dim lviItem As ListItem
For Each lviItem In lvwToChange.ListItems
lviItem.Checked = blnCheck
Next
Set lviItem = Nothing
End Sub
Public Function CountChecked(ByRef lvwToCount As ListView) As Long
Dim lngCount As Long
Dim lviItem As ListItem
For Each lviItem In lvwToCount.ListItems
If lviItem.Checked Then
lngCount = lngCount + 1
End If
Next
Set lviItem = Nothing
CountChecked = lngCount
End Function
希望这有帮助。查看MSDN上的LVM_SETITEMSTATE。它提供了一个如何为特定索引设置选中/未选中状态的示例。但是,根据上面的文档,您可以通过-1同时影响所有文档。不过,据我所知,没有办法收回检查过的项目的数量。你必须迭代每一项并检查它的状态,在你前进的过程中不断积累。好吧,部分方法比我之前的方法要好。谢谢谢谢你的回复。我是否必须使用API,没有。但是对于ListBox来说,通过控件内容的循环要慢一些,我假设对于ListView来说也会慢一些。(如果存在一条返回我所需内容的消息,为什么要发送N条windows消息?O(N)vs O(1))因此我提出了问题。