Win32 C ++ ListView HDN_BEGINTRACK无法正常工作

问题描述

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

我处理标头事件的代码如下。 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",MB_OK);
            break;
        }
    }
    break;
}

调试debugval事件时(应该是),4294966969的值为HDN_BEGINTRACK

对于为什么它无法按预期运行感到绝对困惑;任何帮助将不胜感激。

解决方法

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_NOTIFYcode的{​​{1}}通知。即4294966969(十月0xFFFFFEB9),即-327通知。

,

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

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

SendMessage(Instructions_ListView,CCM_SETVERSION,5,0);

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...