【问题标题】:How to properly change focus item in the ListView control?如何正确更改 ListView 控件中的焦点项?
【发布时间】:2014-11-06 00:29:19
【问题描述】:

如果我想更改 ListView 控件中的焦点项,请执行以下操作:

BOOL setListFocusItem(CListCtrl* pList, int nIndex)
{
    return !!pList->SetItemState(nInd, LVIS_FOCUSED, LVIS_FOCUSED);
}

这是你的做法吗?

因为焦点本身会发生变化,但这会产生一个问题。例如,如果列表有 100 个项目并且焦点位于项目 1。如果我随后调用我的方法 setListFocusItem(99); 焦点将更改为项目 99,但如果我按住 shift 单击项目 90,我会期望列表以选择项目 90 到 99。但是列表选择了项目 1 到 90。所以显然我的 setListFocusItem() 方法不会更改 shift-click“第一个”位置。那么问题是如何让它做到这一点?

【问题讨论】:

  • 顺便说一句,这是列表视图的标准行为。如果单击文件 A,然后按住 control 键将光标向下移动以将焦点(而不是选择)移动到文件 D,然后按住 shift 键单击文件 H,范围从 A->H,而不是 D-> H.
  • @JonathanPotter:对不起,我无法复制它。能再解释一下吗?

标签: c++ windows listview winapi mfc


【解决方案1】:

简答:使用LVM_SETSELECTIONMARK 消息。

(在 MFC 语言中,CListCtrl::SetSelectionMark)。

【讨论】:

  • 您可能还想启用LVIS_SELECTED 项目状态,而不仅仅是LVIS_FOCUSED。一个项目可以被聚焦但不能被选中,反之亦然。这就是为什么它们是独立的州旗。
  • @Jonathan:谢谢。我不知道它叫“选择标记”。
  • @RemyLebeau:不一定。这与项目选择无关。例如,我的列表可能有 1、2、10000 或 0 个选定项目。所有这些都与项目焦点无关。在我上面的代码中添加CListCtrl::SetSelectionMark 可以解决我在原始帖子中描述的 shift-click 问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-13
  • 1970-01-01
  • 2012-08-24
  • 1970-01-01
  • 2012-03-23
相关资源
最近更新 更多