void CMainFrame::OnClose() { BOOL fClose = TRUE; BOOL bidon; CMyMDIChildWnd* pChildWnd; while ((pChildWnd = (CMyMDIChildWnd*) MDIGetActive(&bidon)) != 0) { MDINext(); if (! pChildWnd->Close()) { fClose = FALSE; } } if (fClose) { /* ** Save frame window position and size. */ CRect wndRect; GetWindowRect(&wndRect); CDemoApp* pApp = (CDemoApp*) AfxGetApp(); pApp->WriteProfileInt("MainWindow", "Left", wndRect.left); pApp->WriteProfileInt("MainWindow", "Top", wndRect.top); pApp->WriteProfileInt("MainWindow", "Right", wndRect.right); pApp->WriteProfileInt("MainWindow", "Bottom", wndRect.bottom); /* ** Close frame window. */ CMDIFrameWnd::OnClose(); } else { /* ** Postpone closing. */ PostMessage(WM_NULL, 0, 0); PostMessage(WM_NULL, 0, 0); PostMessage(WM_NULL, 0, 0); PostMessage(WM_NULL, 0, 0); PostMessage(WM_CLOSE, 0, 0); } }
时间: 2024-04-19 09:26:16 浏览: 204
这段代码是在应用程序的主窗口类 `CMainFrame` 中的 `OnClose` 函数中执行的。让我逐行解释:
- `BOOL fClose = TRUE;`:定义一个布尔变量 `fClose`,初始化为 `TRUE`,用于记录是否可以关闭窗口。
- `BOOL bidon;`:定义一个布尔变量 `bidon`,用于接收 `MDIGetActive` 函数的返回值。
- `CMyMDIChildWnd* pChildWnd;`:定义一个指向 `CMyMDIChildWnd` 类的指针变量 `pChildWnd`,用于遍历活动的 MDI 子窗口。
- `while ((pChildWnd = (CMyMDIChildWnd*) MDIGetActive(&bidon)) != 0)`:循环遍历活动的 MDI 子窗口,直到没有子窗口为止。`MDIGetActive` 函数返回活动的 MDI 子窗口,并将结果保存在 `pChildWnd` 中。
- `MDINext();`:将下一个 MDI 子窗口设置为活动窗口。
- `if (!pChildWnd->Close())`:调用子窗口的 `Close` 函数,如果关闭操作失败,则将 `fClose` 设置为 `FALSE`。
- `if (fClose)`:如果可以关闭窗口,则执行以下代码块:
- `CRect wndRect; GetWindowRect(&wndRect);`:获取主窗口的位置和大小。
- `CDemoApp* pApp = (CDemoApp*) AfxGetApp();`:获取应用程序对象的指针。
- `pApp->WriteProfileInt("MainWindow", "Left", wndRect.left);`:将主窗口的左边位置写入配置文件。
- `pApp->WriteProfileInt("MainWindow", "Top", wndRect.top);`:将主窗口的上边位置写入配置文件。
- `pApp->WriteProfileInt("MainWindow", "Right", wndRect.right);`:将主窗口的右边位置写入配置文件。
- `pApp->WriteProfileInt("MainWindow", "Bottom", wndRect.bottom);`:将主窗口的下边位置写入配置文件。
- `CMDIFrameWnd::OnClose();`:关闭主窗口。
- `else`:如果不可以关闭窗口,则执行以下代码块:
- `PostMessage(WM_NULL, 0, 0);`:发送一个空消息。
- `PostMessage(WM_CLOSE, 0, 0);`:发送一个关闭窗口的消息。
这段代码的作用是在关闭主窗口时,遍历所有活动的 MDI 子窗口,并依次调用子窗口的 `Close` 函数进行关闭操作。如果所有子窗口都成功关闭,则保存主窗口的位置和大小到配置文件,并关闭主窗口。如果有任何一个子窗口无法关闭,则延迟关闭操作。
阅读全文