问题描述
我有一个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_NOTIFY
为code
的{{1}}通知。即4294966969
(十月0xFFFFFEB9
),即-327
通知。
使用COMCTL32版本5时,应用程序需要向公共控件发送CCM_SETVERSION消息,以利用新功能和早期版本中不提供的修复程序。除非控件版本大于或等于5,否则列表视图控件不会转发所有标头通知。COMCTL32版本6中的列表视图控件会转发所有标头通知,而不向控件发送CCM_SETVERSION消息。
因此,在创建列表视图后的示例中,请添加以下行
SendMessage(Instructions_ListView,CCM_SETVERSION,5,0);