【问题标题】:Clistctrl selection detectClistctrl 选择检测
【发布时间】:2012-05-10 10:34:24
【问题描述】:

我一直在玩列表视图,偶然发现了这个帖子:How to detect a CListCtrl selection change?

但是那里使用的代码有一个主要流程,它不适用于多选(正如该线程中所指出的那样)。所以我的问题是如何使代码与多选一起工作(例如,使用 shift 或 ctrl 进行选择)?

【问题讨论】:

  • 这不起作用:stackoverflow.com/questions/464675/… 在接受答案的 cmets 中有一条关于 AlwaysShowSelection 属性的评论
  • AlwaysShowSelection 不起作用。它仅在列表视图失焦时保留选择。主要问题是,当您使用 shift 选择多行,然后选择其中一个(取消选择其他行)时,该函数不会捕获更改。
  • 如果这是它没有检测到的唯一情况,那么您不能简单地点击按钮并检查选择以修复该行为吗?
  • LVN_ITEMCHANGED notification 为您提供所有通知,包括多选项目。那里的代码 sn-p 可能会出错 if 进入“做事”。

标签: c++ visual-c++ mfc wtl clistctrl


【解决方案1】:

我编写了一个方便的函数来查看您的 OnItemChanged 通知是否是由于选择更改:

BOOL IsItemSelChanged(NMLISTVIEW* pNMListView)
{
    // call this from your OnItemchangedMyListCtrl function in your dialog class

    if(!(pNMListView->uChanged & LVIF_STATE))
    {
        return(FALSE);
    }

    if((pNMListView->uOldState & LVIS_SELECTED) == (pNMListView->uNewState & LVIS_SELECTED))
    {
        return(FALSE);
    }

    return(TRUE);
}

【讨论】:

  • 这没有回答问题。
【解决方案2】:

处理LVN_ITEMCHANGEDLVN_ODSTATECHANGED,您所需要的一切......

如果列表视图控件具有 LVS_OWNERDATA 样式,并且用户 通过按住 SHIFT 键并单击来选择一系列项目 鼠标,LVN_ITEMCHANGED 通知不会为每个发送 选择或取消选择的项目。相反,您将收到一个 LVN_ODSTATECHANGED 通知,表示某个范围内的项目有 改变状态。

【讨论】:

    猜你喜欢
    • 2010-11-30
    • 1970-01-01
    • 2023-03-18
    • 2013-05-10
    • 2016-12-05
    • 1970-01-01
    • 2023-03-28
    • 1970-01-01
    • 2023-03-30
    相关资源
    最近更新 更多