【问题标题】:Win32 C++ ListView HDN_BEGINTRACK not workingWin32 C++ ListView HDN_BEGINTRACK 不工作
【发布时间】:2021-01-24 15:44:12
【问题描述】:

我有一个 ListView,我希望防止调整其列的大小。我正在使用类似于this 问题的代码,但是无法识别我的HDN_BEGINTRACK 消息。

我创建 ListView 的代码:

HWND Instructions_ListView = CreateWindowEx(LVS_EX_DOUBLEBUFFER |
      LVS_EX_FULLROWSELECT, WC_LISTVIEW, L"", WS_CHILD | WS_VISIBLE | 
      LVS_REPORT | LVS_EDITLABELS, 320, 50, 300, 400, hWnd, NULL, NULL, NULL);

我处理标题事件的代码如下。 WM_NOTIFY 在主程序窗口的 WndProc 内:

case WM_NOTIFY:
{
    UINT debugval = (((LPNMHDR)lParam)->code);
    switch (((LPNMHDR)lParam)->code)
    {
        case HDN_BEGINTRACKA:
        case HDN_BEGINTRACK:
        {
            ::MessageBox(hWnd, L"RESIZE", L"", MB_OK);
            break;
        }
    }
    break;
}

当调试debugval 的值是4294966969 时(应该是什么)HDN_BEGINTRACK 事件。

对于为什么它没有按预期工作感到非常困惑;任何帮助将不胜感激。

【问题讨论】:

    标签: c listview winapi win32gui


    【解决方案1】:

    ListView 的标题控件是ListView 的子控件,因此标题的WM_NOTIFY 通知将发送到ListView 本身,而不是您的父窗口。因此,您的 WndProc 将看不到它们。

    要捕获由 ListView 的内部子控件发送的WM_NOTIFY(和WM_COMMAND)消息,您需要使用SetWindowLongPtr(GWL_WNDPROC)SetWindowSubclass()subclass the ListView

    仅供参考,HDN_BEGINTRACKA 的值为 4294966990-306,十六进制 0xFFFFFECE),HDN_BEGINTRACKW 的值为 4294966970-326,十六进制 0xFFFFFEBA)。

    您说您收到WM_NOTIFY 通知,其中code4294966969。即0xFFFFFEB9 (dec -327),即HDN_ENDTRACKW 通知。

    【讨论】:

    • 好东西,现在似乎可以工作了。谢谢!顺便说一句,为什么我的主要WndProc() 会处理HDN_ENDTRACKW 而不是HDN_BEGINTRACKW 你知道吗?
    • ListView 不应将任何消息发送到您的主窗口。您是否检查以验证HDN_ENDTRACK 通知的NMHDR::hwndFrom 字段是ListView 本身的HWND(或其标题-您可以使用ListView_GetHeader() 来获取HWND),而不是其他一些控件在你的主窗口上?
    • hwndFrom 值与ListView_GetHeader() 返回的值相匹配。
    • @RemyLebeau 实际上列表视图确实将一些标题通知转发给其父级;当您调整标题大小时,列表视图将向您转发HDN_ITEMCHANGINGHDN_ITEMCHANGED 通知,并在跟踪停止时向您转发HDN_ENDTRACK。不过,我认为这实际上并没有记录在案。
    【解决方案2】:

    使用 COMCTL32 版本 5 时,应用程序需要向通用控件发送 CCM_SETVERSION 消息,以利用早期版本中不可用的新功能和修复。除非控件版本大于或等于 5,否则列表视图控件不会转发所有标头通知。COMCTL32 版本 6 中的列表视图控件转发所有标头通知,而不向控件发送 CCM_SETVERSION 消息。

    因此,在创建列表视图后,请在您的示例中添加以下行

    SendMessage(Instructions_ListView, CCM_SETVERSION, 5, 0);

    【讨论】:

      猜你喜欢
      • 2020-08-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-08
      • 2021-02-06
      • 1970-01-01
      • 2018-01-23
      • 1970-01-01
      相关资源
      最近更新 更多