c++ 子窗口关闭导致主窗口也关闭了是什么原因呢如何避免 请写下详细代码
时间: 2024-02-22 15:00:52 浏览: 107
c# 实现子窗口关闭父窗口也关闭的方法
下面是一个示例代码,演示了如何避免子窗口关闭导致主窗口也关闭的问题:
```cpp
// 主窗口的消息处理函数
LRESULT CALLBACK MainWndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
switch (msg)
{
case WM_CLOSE:
// 如果用户关闭主窗口,发送 WM_DESTROY 消息
// 这样会将 WM_QUIT 消息添加到消息队列中
// 但是,我们可以在消息循环中忽略这个消息,以避免整个应用程序退出
DestroyWindow(hWnd);
break;
case WM_DESTROY:
// 当主窗口销毁时,发送 WM_QUIT 消息
// 这样会让消息循环结束,应用程序退出
PostQuitMessage(0);
break;
default:
return DefWindowProc(hWnd, msg, wParam, lParam);
}
return 0;
}
// 子窗口的消息处理函数
LRESULT CALLBACK ChildWndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
switch (msg)
{
case WM_CLOSE:
// 如果用户关闭子窗口,使用 DestroyWindow 函数销毁子窗口
DestroyWindow(hWnd);
break;
default:
return DefWindowProc(hWnd, msg, wParam, lParam);
}
return 0;
}
// 创建主窗口和子窗口
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd)
{
// 注册主窗口的窗口类
WNDCLASS wcMain = { 0 };
wcMain.lpfnWndProc = MainWndProc;
wcMain.hInstance = hInstance;
wcMain.hCursor = LoadCursor(NULL, IDC_ARROW);
wcMain.lpszClassName = TEXT("MainWndClass");
RegisterClass(&wcMain);
// 创建主窗口
HWND hWndMain = CreateWindow(
TEXT("MainWndClass"), TEXT("Main Window"), WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, CW_USEDEFAULT, 800, 600, NULL, NULL, hInstance, NULL);
// 注册子窗口的窗口类
WNDCLASS wcChild = { 0 };
wcChild.lpfnWndProc = ChildWndProc;
wcChild.hInstance = hInstance;
wcChild.hCursor = LoadCursor(NULL, IDC_ARROW);
wcChild.lpszClassName = TEXT("ChildWndClass");
RegisterClass(&wcChild);
// 创建子窗口
HWND hWndChild = CreateWindow(
TEXT("ChildWndClass"), TEXT("Child Window"), WS_OVERLAPPEDWINDOW,
100, 100, 400, 300, hWndMain, NULL, hInstance, NULL);
// 显示主窗口和子窗口
ShowWindow(hWndMain, nShowCmd);
ShowWindow(hWndChild, nShowCmd);
// 进入消息循环
MSG msg;
while (GetMessage(&msg, NULL, 0, 0))
{
// 在消息循环中,忽略 WM_QUIT 消息
if (msg.message == WM_QUIT)
{
break;
}
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return 0;
}
```
在上面的示例代码中,我们将主窗口和子窗口的消息处理函数分别实现,并在应用程序的消息循环中忽略了 `WM_QUIT` 消息,以避免整个应用程序退出。当用户关闭主窗口时,我们使用 `DestroyWindow` 函数销毁主窗口,这会触发 `WM_DESTROY` 消息,我们在 `WM_DESTROY` 消息中使用 `PostQuitMessage` 函数向消息队列中添加 `WM_QUIT` 消息,以退出消息循环。当用户关闭子窗口时,我们使用 `DestroyWindow` 函数销毁子窗口,这不会影响主窗口的运行。
阅读全文