允许在资源管理器样式的列表视图中选择从第一列开始

Posted

技术标签:

【中文标题】允许在资源管理器样式的列表视图中选择从第一列开始【英文标题】:Allow selection in Explorer-style list view to start in the first column 【发布时间】:2013-03-22 23:08:22 【问题描述】:

在 Windows 7 的 Windows 资源管理器列表视图 (what allegedly is not list view at all) 的详细信息视图中,您可以在第一列 (Name) 中启动选择框。您只需要在实际名称之外开始。

详情视图中的默认样式列表视图控件也是如此。

但是如果将列表视图控件设置为资源管理器样式(使用SetWindowTheme),应该模仿 Windows 资源管理器,这将不再起作用。您只能在第二列及以后的列中开始选择。

SetWindowTheme(listView1.Handle, "explorer", null);

有没有办法让列表视图模仿资源管理器的选择风格?

我想没有设置可以启用这种行为,并且必须对其进行编码。就像处理鼠标按下和触发选择一样。但我不知道该怎么做。

谢谢。

Ntb,我正在使用 C++Builder,但这应该是纯粹的 Win32 问题。我也用 WinForms 对此进行了测试(因此上面的 C# 示例)。

【问题讨论】:

【参考方案1】:

有没有办法让列表视图模仿资源管理器的选择风格?

不,explorer 主题中的 SysListView32 不会那样做。现代资源管理器使用的控件实际上是DirectUIHwnd。而且您无法使用其中之一。

获得DirectUIHwnd 行为的唯一方法是自己编写代码。我希望这是可能的,但我也希望它很难实现。

【讨论】:

谢谢。我很确定我不能设置任何东西来让它表现得像我想要的那样。我希望这必须被编码。我只是不知道怎么做。编辑了问题以使其明确。 好吧,我回答了最初的问题。显然,可以进行这样的控制。探险家就是证明。您是否可以将其移植到SysListView32 是另一回事。我很怀疑。 赏金给你,不幸的是,我没有得到更好的答案:) 谢谢。 谢谢。我会说你的部分问题是你实际上并没有要求不同的答案。我选择了你在我的回答中引用的问题。你问“有什么办法吗?”这真的是一个是/否类型的问题。我想,你想做的是问一个后续问题,“我该怎么做?” 我知道我最初的问题不够具体。但是在我的编辑之后,我看不到如何进一步改进它。我将不得不再次发布同样的问题,这看起来不是一个好主意:)【参考方案2】:

实际上有一种方法可以模拟资源管理器的选择行为。它需要大量额外的声明性工作,但这是可能的。

您需要通过未记录的LVM_QUERYINTERFACE 消息获取未记录的IListView 接口(请注意,Windows Vista 和 Windows 7+ 的接口声明和 GUID 不同)。可以在此处找到有关常量和声明的详细信息:

IListView Geoff Chappell - 软件分析师或 Undocumented List View Features 在代码项目中。

获取接口后,您只需调用SetSelectionFlags(1, 1) 方法即可。瞧,你完成了。

【讨论】:

谢谢!您在哪里找到 SetSelectionFlags 的值? 我已经在 Windows 7、8.1 和 10 上成功测试了这个。在 Vista 上不起作用(是的,我使用了 Vista 特定的 GUID/接口);我可以检索特定于 Vista 的界面,但 SetSelectionFlags 没有任何效果。我在 Windows XP 上向列表视图发送 LVM_QUERYINTERFACE 消息没有任何副作用。 祝你在未来版本的 Windows 上好运 @David,当然可以随时删除任何未记录的功能,但在这种特殊情况下,它不会破坏工作代码。仍然 ListView 是最复杂和最令人困惑的 comctrl 控件,并且似乎 MS 在它工作时不敢触摸它(现在存在几十年的错误,甚至没有人试图修复它们),所以这个解决方案肯定会持续很多年。 @Martin,我不记得我是如何找到它的。可能是我在某个论坛上找到的(不太可能)或者是我自己想出来的(更有可能,因为我花了很多天甚至几周的时间来试验 IListView 界面和 ListView 控件)。

以上是关于允许在资源管理器样式的列表视图中选择从第一列开始的主要内容,如果未能解决你的问题,请参考以下文章

带有选取器(分段控件)子视图和选择手势的列表项

在NSTableView中使用第一列拖动图像

有没有办法在 ag 网格中的 2 个单元格渲染器之间传递数据?

如何使选择器视图从 swift 3 中的特定行显示?

怎样读取excel某一列的每一行内容

C#中listview控件是啥东东??咋用的