我有一个用WinAPI编写的程序。 我有登录窗口,然后是实际的程序窗口。 我想破坏登录窗口,并创建新窗口..
我一直在用这个:
销毁程序:
DestroyWindow(MainHwnd);
和窗口的WndProc(MainHwnd窗口):
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中的人们在我之前的问题中告诉我,我当前正在摧毁窗口,而且我正在导致Stack Overflow结束窗口被破坏的地方(程序仍在运行 - 所以看起来就像一切正如计划一样),但我不想使用糟糕的编程(特别是导致堆栈溢出破坏窗口哈哈)
那么,我怎样才能正确销毁窗户呢?
另外,有时候,当我使用DestroyWindow(MainHwnd)
时,它会进入WM_DESTROY
和WM_CLOSE
(在我上面发布的当前WndProc中)..这是否与Stack Overflow相关问题?
顺便说一下 - 我也知道如何在#C中使用Windows窗体,我正在尝试写一些类似的东西:
关闭当前窗口的this.Close();
(也许这会让我的问题更加明确)......
谢谢!
答案 0 :(得分: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
基本上就是我所说的。
瓦尔特