【问题标题】:Destroying the current window and create a new one销毁当前窗口并创建一个新窗口
【发布时间】:2014-03-30 20:31:54
【问题描述】:

我有一个用 WinAPI 编写的程序。 我有登录窗口,然后是实际的程序窗口。 我想销毁登录窗口,并创建新窗口..

我一直在用这个:

销毁程序:

    DestroyWindow(MainHwnd);

和窗口(MainHwnd的窗口)的WndProc:

LRESULT Client::WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
switch(msg)
{
    case WM_CREATE:
    break;

    case WM_COMMAND:
    break;

    case WM_CLOSE:
        DestroyWindow(hwnd);
    break;

    case WM_DESTROY:
        PostQuitMessage(1);
    break;

    default:
        return DefWindowProc(hwnd, msg, wParam, lParam);
}

return 0;
}

StackOverflow 中的人在我之前的问题中告诉我,我目前并没有破坏窗口,并且我正在导致堆栈溢出,它在窗口被破坏的地方结束(程序仍然运行 - 所以看起来就像一切都按计划进行),但我不想使用糟糕的编程(特别是导致堆栈溢出破坏窗口哈哈)

那么,我怎样才能正确地销毁一个窗口呢?

另外,有时,当我使用DestroyWindow(MainHwnd) 时,它会同时进入WM_DESTROYWM_CLOSE(在我上面发布的当前WndProc 中)。这与堆栈溢出问题有关吗?

顺便说一句 - 我也知道如何在#C 中使用 Windows 窗体,我正在尝试编写类似以下内容: this.Close(); 关闭当前窗口(也许这让我的问题更清楚)...

谢谢!

【问题讨论】:

  • 我相信你必须返回return DefWindowProc(hwnd, msg, wParam, lParam); 并且在case wm_destroy 它是PostQuitMessage(0); return 0;
  • DestroyWindow 没问题。用 SSCCE 代替描述怎么样。
  • 但是这里有人告诉我DestroyWindow 调用WM_CLOSE,而在WM_CLOSE 我又调用DestroyWindow...这不是一个无限循环吗?另外,什么是 SSCCE?
  • 否,DestroyWindow() 会导致发送 WM_DESTROY。 SSCCE 是一个小程序,我们可以运行它来演示问题。顺便说一句,使用“MainHwnd”作为存储登录窗口句柄的变量的名称非常奇怪,您甚至发布了正确的代码吗?
  • MainHwnd 是实际客户端的名称,有一个案例我尝试销毁它并打开一个新窗口...

标签: c winapi window


【解决方案1】:

来自微软关于WM_CLOSE

An application can prompt the user for confirmation, prior to destroying a window, by processing the WM_CLOSE message and calling the DestroyWindow function only if the user confirms the choice. By default, the DefWindowProc function calls the DestroyWindow function to destroy the window.

所以调用DestroyWindow(hwnd);与否是一样的。

LRESULT Client::WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
    switch(msg)
    {
        case WM_CREATE:
            break;

        case WM_COMMAND:
            break;

        case WM_CLOSE:
            //DestroyWindow(hwnd);
            break;

        or

        case WM_CLOSE:
            DestroyWindow(hwnd);
            return 0;

        case WM_DESTROY:
            PostQuitMessage(0);
            return 0;

        default:
           return DefWindowProc(hwnd, msg, wParam, lParam);
    }

    return DefWindowProc(hwnd, msg, wParam, lParam);
}

看一个例子closing window

基本上就是我说的。

变态

【讨论】:

  • 如果是这样,那为什么有时我调用DestroyWindow(hwnd) 会使我的代码进入WM_DESTROY 从而关闭我的应用程序,或者根本不破坏我的窗口? (而且在任何时候,它都是完全相同的同一行代码,在同一个地方!)
  • @Amit 正常的方法是什么都不做,让return DefWindowProc(hwnd, msg, wParam, lParam); 完成工作(如我的评论中所述)。否则,如果你显式调用DestroyWindow(hwnd);,你应该返回 0。
  • 所以我的 wndproc 中根本没有提到 wm_destroy 吗?
  • Amit 声称直接调用 DestroyWindow,所以我不明白这是如何应用的。
  • 谢谢!另外,我的程序退出是因为我的WM_CLOSE和WM_DESTROY`是相反的(所以当它想销毁程序时,它也退出了它)..我所做的只是在WM_DESTROY和@之间切换987654332@,它修复了它!谢谢大家!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-22
相关资源
最近更新 更多