【发布时间】:2023-03-19 08:20:02
【问题描述】:
我将子 hwnd 创建为带有关闭按钮的弹出窗口,WndchildProc 用于处理来自子窗口的消息
m_childHwnd = CreateWindowEx(
NULL,
TEXT("STATIC"), TEXT("childW"),
WS_CAPTION | WS_SYSMENU | WS_THICKFRAME | WS_VISIBLE,
CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
m_parentHWnd, NULL,
GetModuleHandle(NULL), NULL
);
m_childhProc = (WNDPROC)SetWindowLongPtr(m_childHwnd , GWLP_WNDPROC, (LONG_PTR)WndChildProc);
static LRESULT CALLBACK WndChildProc(HWND hwnd, UINT message, WPARAM wParam,
LPARAM lParam)
{
switch (message)
{
case WM_CLOSE:
DestroyWindow(hwnd);
return 0;
case WM_DESTROY:
PostQuitMessage(0);
break;
}
default:
return CallWindowProc(m_childhProc, hwnd, message, wParam, lParam);
}
我预计当我按下子窗口的关闭按钮时会触发消息WM_CLOSE。我可以用这种方式关闭孩子hwnd。
但是当按下子hwnd 的关闭按钮时,什么也没有发生。如果按下parent-hwnd 的关闭按钮,WM_DESTROY 消息触发。
所以,我不能用它的关闭按钮关闭(只是)子窗口。
如何使用关闭按钮关闭子窗口?
更新:复制中缺少文本,添加:默认情况下的 CallWindowProc。
【问题讨论】:
-
您的窗口过程需要调用所有其他情况的默认窗口过程。
-
子窗口是
WS_CHILD样式的窗口。你的问题中没有。我没有关注,您要解决什么问题。此外,是时候抛弃旧的(且危险的)子类控件方式,转而使用提供的基础架构(参见Subclassing Controls)。