无活动CView时,如何获取MDI应用的CView区域有效客户区?
获取MDI应用中无CView时的原视图区域
在基于CMDIFrameWndEx的MDI应用里,当不存在CView实例时,要获取原本分配给CView的有效客户区,可采用以下两种方法:
使用框架内置方法(推荐)
CMDIFrameWndEx提供的GetClientAreaRect方法会自动排除停靠窗格、工具栏、状态栏等占用的空间,直接返回中间视图区域的矩形:CRect viewClientRect; CMDIFrameWndEx* pMainFrame = dynamic_cast<CMDIFrameWndEx*>(AfxGetApp()->GetMainWnd()); if (pMainFrame != nullptr) { pMainFrame->GetClientAreaRect(viewClientRect); // viewClientRect即为目标区域 }手动计算(兼容低版本MFC)
如果你的MFC版本没有GetClientAreaRect接口,可以手动计算:- 先获取主框架的整体客户区:
AfxGetApp()->GetMainWnd()->GetClientRect(&oCRectClient); - 通过主框架的
GetDockingManager()获取停靠管理器,遍历所有注册的停靠窗格 - 将每个停靠窗格的窗口矩形转换为主框架客户区坐标,从
oCRectClient中减去这些区域,剩余部分就是原CView的有效区域
- 先获取主框架的整体客户区:
需要注意的是,GetClientAreaRect已经封装了所有布局逻辑,能正确处理停靠窗格的显示/隐藏、浮动、自动隐藏等各种状态,是最可靠的实现方式。
内容的提问来源于stack exchange,提问作者alman
相关产品推荐
相关产品推荐

