【发布时间】:2017-08-04 18:03:10
【问题描述】:
我有一个ListView,我在上面显示其他控件。当您单击其中一个控件并采取行动时,我可以捕获。我想要的是将点击通知发送到它下面的ListView,这样它就好像ListView 被点击了一样。因此它将选择/取消选择单击发生的ListView 中的项目。我想向ListView 发送点击消息,而不是手动选择/取消选择该项目,因为我不想尝试确定它是否是多选列表,按下了哪些键,哪些非-单击的项目需要保持选中或未选中状态,...理想情况下,我会向ListView 发送一个单击通知,它会采取所有适当的操作,就像它被单击一样。
我曾尝试从user32.dll 调用SendMessage - WM_NOTIFY 和OCM_NOTIFY 都使用NMITEMACTIVATE 结构作为lParam。我似乎无法让它工作。我也玩过OnNotifyMessage 电话,但没有运气。
我可以从列表视图顶部的控件中成功捕获单击事件,获取光标位置,将其转换为下方ListView 中的项目/子项目,......我只是无法以编程方式发送任何需要发送到ListView 的通知,以便它采取适当的措施。
编辑:
下面链接中的可能解决方案将允许单击通过控件传递到其下方的 ListView,但您必须为所有控件创建自定义类,并且您无法处理顶部控件中的任何单击事件。
【问题讨论】:
-
似乎你只是过于复杂了你需要的东西。 “我不想尝试确定它是否是多选列表。” - 这是一个 1-liner
-
如果它是一个多选列表,并且您向列表发送了一个点击事件,那么当没有按下 ctrl 按钮时,它应该表现得只选择一项。换句话说,我没有看到手动选择/取消选择时增加的复杂性。
-
尝试和模拟 ListView 的逻辑会非常复杂。您需要知道 1) 是否是多选,2) 是否按下 ctrl 键,3) 是否按下 shift 键,4) 最后选择的项目是什么(如果选择了一个),5) 是当前选择的项目或不...虽然很容易得到所有这些的答案,但您需要根据这些变量的所有组合来编程选择和取消选择的内容 - 仅仅触发一个会变得混乱和容易得多向 ListView 发送消息并让它完成
-
例如,如果它是多选并按下 Ctrl 键,您只需选择/取消选择单击发生的项目(并保留所有其他项目)。如果按下 Shift 键,您将需要知道最后选择的项目是什么,然后选择两者之间的所有项目(至少所有其他项目)。如果既没有按下 Ctrl 也没有按下 Shift 键,您将选择/取消选择单击发生的项目并取消选择任何其他已选择的项目。我相信这一切都是可能的,但如果有一种简单的方法可以告诉 ListView 来解决它,那将是理想的