【发布时间】:2021-01-31 04:18:49
【问题描述】:
我有一个 ListView,我想根据 ListView 本身的大小(根据窗口大小调整大小)调整其列的大小。 ListView 是一个单独的WNDPROC 的子类,其中WM_NOTIFY 用于处理其他消息。
要调整我正在使用ListView_SetColumnWidth() 的标题列的大小,但这仅在我停用单独的ListView WNDPROC 或从中删除WM_NOTIFY 处理时才有效。
我尝试在 WNDPROC 中手动处理 ListView 及其标题的 LVM_SETCOLUMNWIDTH,以查看消息是否通过,但无济于事。
我不太确定如何进行;任何帮助将不胜感激。
作为参考,我的 ListView 中的WM_NOTIFY WNDPROC:
case WM_NOTIFY:
{
UINT debugval = (((LPNMHDR)lParam)->code);
switch (((LPNMHDR)lParam)->code)
{
case HDN_BEGINTRACK:
{
return TRUE; //Prevent manual resizing.
break;
}
case LVM_SETCOLUMNWIDTH:
{
::MessageBox(hwnd, L"test", L"test", MB_OK);
break;
}
}
break;
}
【问题讨论】:
-
您的自定义
WNDPROC是否为它不手动处理的消息调用默认窗口过程?喜欢LVM_SETCOLUMNWIDTH? -
CallWindowProc()的默认情况从 ListViewWNDPROC转到主WNDPROC和从标题的WNDPROC到 ListView 的。 -
当您删除 WM_NOTIFY 处理时它起作用,因此显然涉及 WM_NOTIFY 消息,并且当您更改对该消息的处理时它起作用。你改变了什么?
-
我只在 ListView
WNDPROC中处理HDN_BEGINTRACK。当我用一些代码添加LVM_SETCOLUMNWIDTH时,什么也没有发生。 -
您必须将您不处理的所有消息传递给子类窗口。包括 WM_NOTIFY + LVM_SETCOLUMNWIDTH。
标签: c listview winapi subclass win32gui