【发布时间】:2022-01-07 06:14:39
【问题描述】:
我使用CreateDialogParam 创建了对话框。它只有一个 ListView 子控件。在对话框WM_INITDIALOG 消息处理程序中,我将ListView 子类化以自定义标题重绘。
现在我想阻止用户调整ListView 列(标题)的大小,为此,我只需要处理ListView 的WndProc 中的HDN_BEGINTRACKA 通知消息,如下所示:
case WM_NOTIFY:
{
if ((((LPNMHDR)lParam)->code == HDN_BEGINTRACKA)
|| (((LPNMHDR)lParam)->code == HDN_BEGINTRACKW))
return TRUE; // to disable column resizing
}
这工作正常;但是,出于某种原因,我想在父(对话框)过程中处理此消息。因此,我将此消息转发给该家长,如下所示:
case WM_NOTIFY:
{
if ((((LPNMHDR)lParam)->code == HDN_BEGINTRACKA)
|| (((LPNMHDR)lParam)->code == HDN_BEGINTRACKW))
{
BOOL b = FALSE;
HWND hParent = GetRealParent(hwnd);
if (hParent) b = SendMessage(hParent, msg, wParam, lParam);
return b; // to disable column resizing return TRUE;
}
}
break;
消息发送正常,但是,即使我从对话过程返回TRUE,在ListView 过程中,SendMessage 调用的返回值是FALSE。
在对话过程中,代码如下:
case WM_NOTIFY:
{
if ((((LPNMHDR)lParam)->code == HDN_BEGINTRACKA)
|| (((LPNMHDR)lParam)->code == HDN_BEGINTRACKW))
return TRUE;
}
所以,我的问题是为什么直接向父级发送(转发)WM_NOTIFY 消息会返回不同的结果,或者根本不起作用?
编辑:-
过去,我也遇到过同样的问题;为了解决它,我尝试了一条用户定义的消息,例如:
#define UWM_WM_NOTIFY (WM_APP + 7)
并将其与SendMessage 一起使用,以在子级和父级之间或任何其他对话框之间进行通信。但它也无法获得正确的返回值。
所以,我使用SendMessage 如下:
BOOL b = FALSE;
SendMessageA(hDlg, UWM_ANY_WM, 0, (LPARAM) &b);
return b;
变量的发送地址为LPARAM以获取返回值。有没有更好的方法来做到这一点。或者为什么SendMessageA返回值不一样?
【问题讨论】:
标签: c winapi sendmessage