问题描述
我有一个ListView,我想根据ListView本身的大小(根据窗口大小调整大小)来调整其列的大小。 ListView由单独的WNDPROC
子类化,其中WM_NOTIFY
用于处理其他消息。
要确定我正在使用的ListView_SetColumnWidth()
标头列的大小,但这仅在我停用单独的ListView WNDPROC
或从中删除WM_NOTIFY
处理时才有效。
我已经尝试在LVM_SETCOLUMNWIDTH
中手动处理WNDPROC
的ListView及其标题,以查看消息是否通过,但无济于事。
我不太确定如何进行;任何帮助将不胜感激。
作为参考,我的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",MB_OK);
break;
}
}
break;
}
解决方法
WM_NOTIFY
是它自己的单独消息,不会像您编写的那样通过case LVM_SETCOLUMNWIDTH
进行传送。您需要将switch
移动到外部CallWindowProc()
中。并确保您要为不想丢弃的所有消息调用DefSubclassProc()
或switch (uMsg)
{
case WM_NOTIFY:
{
UINT code = (((LPNMHDR)lParam)->code);
switch (code)
{
case HDN_BEGINTRACK:
{
return TRUE; //Prevent manual resizing.
}
}
break;
}
case LVM_SETCOLUMNWIDTH:
{
...
break;
}
}
return CallWindowProc(...,hwnd,uMsg,wParam,lParam);
or
return DefSubclassProc(hwnd,lParam);
(取决于创建子类的方式)。
尝试更多类似的方法:
LEFT JOIN
,
我有一个ListView,我想根据ListView本身的大小(根据窗口大小调整大小)来调整其列的大小。
因此,在主窗口中,您需要通过SetWindowPos
修改Listview的大小,并通过ListView_SetColumnWidth
修改ListView列的大小。
类似于以下代码:
@if (strpos($_SERVER['REQUEST_URI'],'admin'))
// your custom template here
@endif
然后,在ListView的LRESULT CALLBACK WndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
{
switch (message)
{
case WM_SIZE:
{
int cxClient = LOWORD(lParam);
int cyClient = HIWORD(lParam);
SetWindowPos(Instructions_ListView,NULL,cxClient / 3,cyClient / 4,cxClient / 5,cyClient / 2,SWP_SHOWWINDOW);
ListView_SetColumnWidth(Instructions_ListView,cxClient / 10);
return 0;
}
case WM_DESTROY:
PostQuitMessage(0);
return 0;
}
return DefWindowProc(hwnd,message,lParam);
}
函数中,WNDPROC
是它自己的唯一消息,不属于LVM_SETCOLUMNWIDTH
。并通过DefSubclassProc
处理其他默认消息。
因此您可以参考以下代码:
WM_NOTIFY
最后,它对我有用: