【发布时间】: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_DESTROY 和WM_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 是实际客户端的名称,有一个案例我尝试销毁它并打开一个新窗口...