【问题标题】:Win32 C++ LVNI_PREVIOUS having no effect with ListView_GetNextItem()Win32 C++ LVNI_PREVIOUS 对 ListView_GetNextItem() 没有影响
【发布时间】:2021-02-23 12:59:11
【问题描述】:

我有一个 ListView,我需要在其中对多个选定的行执行操作。我开始使用ListView_GetNextItem(hLV, -1, LVNI_SELECTED | LVNI_PREVIOUS) 在选定的行中循环。但是在调试时,会返回第一个选定行的索引,而不是最后一个。仅使用LVNI_PREVIOUS 标志时也是如此。

MS documentation 表示:

Windows Vista 和更高版本: 搜索在 wParam 中指定的项目之前排序的项目。 LVNI_PREVIOUS 标志不是定向的(LVNI_ABOVE 将找到位于上方的项目,而 LVNI_PREVIOUS 将找到之前订购的项目。) LVNI_PREVIOUS 标志基本上颠倒了 LVM_GETNEXTITEM 执行的搜索逻辑LVM_GETNEXTITEMINDEX 消息。

为什么LVNI_PREVIOUS 不能按照描述的方式工作?难道是我用错了commctrlversion,因为它只说Vista及以上?

任何帮助将不胜感激,谢谢。

【问题讨论】:

  • 我以前从未尝试过使用LVNI_PREVIOUS。向后迭代时,是否使用 ListView 的项目计数作为起始索引,而不是使用 -1
  • 它没有:只返回-1。
  • 看来他们忘记实现了。
  • Vista之前的头文件中存在#define;我认为对 Vista 的引用只是他们“更新”他们的文档。参见例如LVM_GETHEADER,在 Vista 之前也存在。

标签: c listview winapi win32gui


【解决方案1】:

我在 Win10 上做了一个测试,果然,即使文档没有说,IS对 ComCtl32.dll v6 的依赖。

没有启用 ComCtl32.dll v6:

  • LVNI_PREVIOUSLVM_GETNEXTITEM/ListView_GetNextItem() 无效。
  • LVM_GETNEXTITEMINDEX/ListView_GetNextItemIndex() 根本不起作用(返回值始终为0)。

使用 ComCtl32.dll v6 已启用:

  • LVNI_PREVIOUS 按预期在 LVM_GETNEXTITEM/ListView_GetNextItem() 中工作。
  • LVM_GETNEXTITEMINDEX/ListView_GetNextItemIndex() 也可以工作。

因此,请确保 ComCtl32.dll v6 is enabled 正确(无论如何您都应该这样做,以在 Windows XP 及更高版本上获得最佳 UI 体验)。

【讨论】:

  • 在启用 ComCtl32.dll v6 的 Windows 10 上似乎仍然无法正常工作。你能分享你的工作操作系统构建版本吗? ListView_GetNextItem(hwndListView, -1, LVNI_PREVIOUS) 总是为我返回 -1
  • @RitaHan-MSFT 我使用 Windows 10 1607 Build 14393.1358 进行了测试。但我也有 XP 和 Win7 可供测试。
  • 谢谢。您知道是否可以从不同的 ComCtl 版本中挑选控件吗?我想暂时保留 3D 按钮,但我认为更新的日历控件要好得多。
  • @SyntheticAscension 为此使用Activation Contexts。创建并激活一个 AC 以加载 ComCtl32 v6 并创建日历控件,然后创建并激活另一个 AC 以加载不同版本的 ComCtl32 并创建按钮。
猜你喜欢
  • 2022-01-26
  • 2020-11-10
  • 2015-11-04
  • 2010-12-01
  • 2013-10-07
  • 2021-12-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多