如何使用WM_CLOSE关闭子窗口?

时间:2017-07-27 04:37:46

标签: c++ c winapi hwnd

我使用关闭按钮创建子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。

1 个答案:

答案 0 :(得分:0)

单击关闭按钮时,我找到了带有事件WM_NCLBUTTONUP触发器的解决方案。

case WM_NCLBUTTONUP:
    ShowWindow(hwnd, SW_HIDE);
    return 0;