【问题标题】:How can I close a child window with WM_CLOSE?如何使用 WM_CLOSE 关闭子窗口?
【发布时间】: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)。

标签: c++ c winapi hwnd


【解决方案1】:

当点击关闭按钮时,我找到了事件 WM_NCLBUTTONUP 触发的解决方案。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-15
    • 1970-01-01
    • 1970-01-01
    • 2011-01-17
    相关资源
    最近更新 更多