【问题标题】:How to disable the vertical header tracking line in Win32 ListView Control如何在 Win32 ListView 控件中禁用垂直标题跟踪线
【发布时间】:2018-03-09 17:21:46
【问题描述】:

我正在自定义 Win32 ListView 控件,我想删除调整标题大小时自动绘制的垂直线。我说的是在行区域而不是在标题中绘制的线。可以通过处理 HDN_TRACK 通知并更改通知数据中的 cxy 值来限制垂直跟踪线,但似乎无法限制或删除行区域中的垂直跟踪线。有人对如何删除/隐藏/限制该行有任何想法吗?

上面的截图是我在跟踪标题时截取的

【问题讨论】:

  • 我会惊讶地看到任何将好的 UI 变成坏 UI 的规定。不过,我可能是错的。
  • 你想自己画图还是直接删除线而不替换?
  • 我正在尝试使我的列表视图与 Windows 资源管理器列表视图一样工作。行区域中没有跟踪线,并且最小标题大小仅限于标题标签。我要解决的问题是,当我通过 HDN_TRACK 限制标题大小时,标题中的垂直线停止移动,但行区域中的线继续移动,看起来很难看。所以我需要隐藏行区域中的行或让它像标题一样移动。

标签: windows listview winapi


【解决方案1】:

删除该行只会使用户更难使用控件!

简单的方法可能是启用visual styles/comctl32 v6,它似乎使用实时调整大小,但这可能取决于所选的主题/样式。

我能够为经典控件想出一个丑陋的 hack:

HWND hLV = CreateWindowEx(WS_EX_CLIENTEDGE, WC_LISTVIEW, NULL, WS_CHILD|WS_VISIBLE|WS_HSCROLL|WS_VSCROLL|LVS_REPORT, ...);
SendMessage(hLV, CCM_SETVERSION, 5, 0); // <--- Important

...

case WM_NOTIFY:
{
HWND hLV = ...;
NMHDR&nmh = *(NMHDR*) lparam;
switch(nmh.code)
{
case HDN_BEGINTRACKA:case HDN_BEGINTRACKW:
  LockWindowUpdate(hLV); // Block all drawing in the listview
  return false;
case HDN_ENDTRACKA:case HDN_ENDTRACKW:
  LockWindowUpdate(NULL);
  return false;
}

这可能是depend on the HDS_FULLDRAG header style,并且您可能不想在启用视觉样式时这样做。

【讨论】:

  • LockWindowUpdate,糟糕。
  • @JonathanPotter 是的,但它旨在在拖动操作期间锁定单个窗口,并且 WM_SETREDRAW 不想玩球。
  • 我没有使用 CCM_SETVERSION 语句,但 LockWindowUpdate 通过隐藏该行来工作。唯一的问题是它甚至隐藏了标题的垂直跟踪线,所以现在没有显示跟踪线。
  • 是的,它将禁用整个列表视图区域中的绘图,没有办法解决这个问题。其他选项包括抓取列表视图的屏幕截图并将其显示在位于列表视图顶部的您自己的自定义窗口中,或者将列表视图子类化并自己处理标题通知。
  • 列表视图已经被子类化,我正在使用 comctl32 v6
猜你喜欢
  • 2014-05-20
  • 2012-09-05
  • 1970-01-01
  • 1970-01-01
  • 2019-05-08
  • 1970-01-01
  • 1970-01-01
  • 2013-02-01
  • 2012-05-27
相关资源
最近更新 更多