ListView控件Windows API-CheckAll-CheckCount?

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

我有一个VB6项目,我正在从使用列表框切换到使用列表视图。列表具有复选框样式。我正在查找要发送到ListView的Windows API消息,该消息指定:

  • 全部检查
  • 全部取消选中
  • 支票计数
这对于列表框来说很容易,因为选中的与选中的内容相同。对于ListView,这不是真的

除了选中未选中之外,其他类似于此的内容:

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))因此我提出了问题。