Win32 C++ ListView HDN_BEGINTRACK 不工作

Win32 C++ ListView HDN_BEGINTRACK not working

我有一个 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);

我处理 header 事件的代码如下。 WM_NOTIFY 在主程序的 WndProc 内部 window:

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 事件时。

完全不知道为什么它没有按预期工作;任何帮助将不胜感激。

ListView 的 header 控件是 ListView 的 child,因此 header 的 WM_NOTIFY 通知将发送到 ListView 本身,而不是您的parent window。因此,您的 WndProc 将看不到它们。

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

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

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

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

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

SendMessage(Instructions_ListView, CCM_SETVERSION, 5, 0);