【问题标题】:c++ not able to open child window after closing itc ++关闭后无法打开子窗口
【发布时间】:2024-04-14 05:50:01
【问题描述】:

我的子窗口有一些问题。我使用AppendMenu 中的按钮打开它,但关闭子窗口后,我无法再打开它。

代码:

WNDCLASSEX chwincl;

chwincl.hInstance = hThisInstance;
chwincl.lpszClassName = "Child";
chwincl.lpfnWndProc = ChildProcedure;
chwincl.style = CS_DBLCLKS;
chwincl.cbSize = sizeof(WNDCLASSEX);
chwincl.hIcon = LoadIcon(NULL, IDI_APPLICATION);
chwincl.hIconSm = LoadIcon(NULL, IDI_APPLICATION);
chwincl.hCursor = LoadCursor(NULL, IDC_ARROW);
chwincl.lpszMenuName = NULL;
chwincl.cbClsExtra = 0;
chwincl.cbWndExtra = 0;
chwincl.hbrBackground = (HBRUSH)(COLOR_BACKGROUND);

if (!RegisterClassEx(&chwincl))
    return 2;

chwnd = CreateWindowEx(0,
    "Child",
    "Add...",
    WS_OVERLAPPEDWINDOW,
    CW_USEDEFAULT,
    CW_USEDEFAULT,
    300,
    150,
    HWND_DESKTOP,
    NULL,
    hThisInstance,
    NULL);

我用这个打开子窗口:

if (LOWORD(wParam) == ID_Click) {
        ShowWindow(chwnd, SW_SHOWDEFAULT);
        UpdateWindow(chwnd);
    }

然后我用这个关闭它:

DestroyWindow(chwnd);

为什么我的子窗口只能打开一次?

谢谢

【问题讨论】:

  • 这不是一个最小的例子。请不要让人们阅读大量不必要的代码。
  • 对不起,我认为有必要看看我是如何创建我的窗口的。
  • 我们想看看您是如何创建自己的窗口的。但是,很难相信需要所有六个孙窗口来证明问题。我打赌你可以删除它们。同样,我打赌您可以删除自定义绘制处理程序,问题仍然存在。继续删除代码,直到得到仍然能证明问题的最小程序。
  • 现在你删除的太多了。您需要生成仍然可以演示问题的最小完整程序。您之前的尝试错过了要求的“最小”部分。您的第二次尝试错过了要求的“完整程序”部分。
  • 对不起,我改了。

标签: c++ winapi window childwindow


【解决方案1】:

DestroyWindow 完全破坏窗口。在那次调用之后,它不再存在。所以你不能再用ShowWindow再次显示它——你必须从头开始重新创建它。

不要调用DestroyWindow来隐藏它,而是使用ShowWindow(chwnd, SW_HIDE);

【讨论】:

    【解决方案2】:

    恢复最小化(或关闭)窗口时,您需要在 ShowWindow 调用中使用标志 SW_RESTORE

    【讨论】: