在CMainFrame中创建MDI子窗体

本文介绍如何通过修改C++代码创建一个多文档界面(MDI)应用程序,包括创建自定义的MDI子窗口类、文档模板设置及如何通过菜单项激活特定的MDI子窗口。
1、首先创建一多文档程序;  
2、点击【Insert】,【New Form...】菜单项。  
  在Name中输入 CTemp1View  
  Base Class 选择 CFormView  
  其他不用动,点击“OK”按钮。  
3、点击【Insert】,【New Class...】菜单项。  
  Name: CTempFrm  
  Base class: CMDIChildWnd  
  点击“OK”按钮。  
4、在CXXXApp中添加   
  public:  
  CMultiDocTemplate * m_pTemplate;  
5、在CXXXApp中,修改 InitInstance() 的代码。  

  SetRegistryKey(_T( "Local AppWizard-Generated Applications "));  

LoadStdProfileSettings(); // Load standard INI file options (including MRU)  

// Register the application 's document templates. Document templates  
// serve as the connection between documents, frame windows and views.  

//CMultiDocTemplate* pDocTemplate; //注释掉  
//pDocTemplate = new CMultiDocTemplate( //注释掉  
  //添加自己的MDI子窗体  
m_pTemplate = new CMultiDocTemplate(  
IDR_XXXTYPE,//这里不变  
RUNTIME_CLASS(CXXXDoc),//这里不变  
RUNTIME_CLASS(CTempFrm), // 需要修改  
RUNTIME_CLASS(CTempView));//需要修改  
AddDocTemplate(m_pTemplate);  
  //如果还有其他窗体  
  m_pTemplate2 = new CMultiDocTemplate(  
IDR_XXXTYPE,//这里不变  
RUNTIME_CLASS(CXXXDoc),//这里不变  
RUNTIME_CLASS(CTemp2Frm), // 需要修改  
RUNTIME_CLASS(CTemp2View));//需要修改  
AddDocTemplate(m_pTemplate2);  
  m_pTemplate3 = new CMultiDocTemplate(  
IDR_XXXTYPE,//这里不变  
RUNTIME_CLASS(CXXXDoc),//这里不变  
RUNTIME_CLASS(CTemp3Frm), // 需要修改  
RUNTIME_CLASS(CTemp3View));//需要修改  
AddDocTemplate(m_pTemplate3);  
  ...  

// create main MDI Frame window  
CMainFrame* pMainFrame = new CMainFrame;  
if (!pMainFrame-> LoadFrame(IDR_MAINFRAME))  
return FALSE;  
m_pMainWnd = pMainFrame;  

5、调用子窗体  
  声明变量  
  protected:  
CTempFrm* m_pTempFrm;  
void CMainFrame::OnMenu1Click()   
{  
// 打开已有的框架窗口  
if(pTempFrm)  
MDIActivate (pTempFrm);  
else  
{  
//窗口没有打开,重新打开一个新的窗口  
CDocument *pDoc=((CFXXXApp *)AfxGetApp())-> m_pTemplate-> OpenDocumentFile(NULL);  
pDoc-> SetTitle( "Rovsky");  
//保存与新打开框架窗口指针  
m_pTempFrm= (CTempFrm*)MDIGetActive();  
}  
}
<think>首先,用户的问题是:“MFC MDI文档框架CMainFrame 中获取客户区的Rect”。我需要用中文回答这个问题。 关键点: - **MFC MDI**:Microsoft Foundation Classes 多文档界面。 - **CMainFrame**:这是主框架窗口类。 - **获取客户区的Rect**:意思是获取客户区域的矩形(CRect)。 在MFC中,CMainFrame是主框架窗口,通常从CFrameWnd或CMDIFrameWnd派生。在MDI应用程序中,CMainFrame是主框架窗口,它包含窗口(文档)。 要获取客户区的Rect,我需要在CMainFrame类中实现。客户区是窗口内部可用的区域,不包括边框、标题栏等。 方法: - 在MFC中,可以使用`GetClientRect`函数。这个函数是CWnd类的成员函数,所以任何从CWnd派生的类都可以使用它。 - 具体到CMainFrame,因为CMainFrame是从CMDIFrameWnd派生的,而CMDIFrameWnd是从CFrameWnd派生的,最终从CWnd派生,所以CMainFrame对象可以调用`GetClientRect`。 步骤: 1. 在CMainFrame类中,添加一个成员函数或直接在需要的地方调用`GetClientRect`。 2. `GetClientRect`函数原型:`void GetClientRect(LPRECT lpRect) const;`,它需要一个指向RECT结构或CRect对象的指针。 3. 在代码中,可以这样使用:`CRect rect; GetClientRect(&rect);` 但用户提到“获取客户区的Rect”,在MDI框架中,CMainFrame的客户区通常包括工具栏、状态栏和MDI客户窗口(用于管理窗口)。在MDI应用中,CMainFrame的客户区可能不是整个窗口的客户区,因为MDI客户窗口占据了部分区域。 在标准MDI框架中: - CMainFrame的客户区由MDI客户窗口(一个CView或类似)填充。 - 直接调用`GetClientRect`在CMainFrame上会返回整个框架窗口的客户区矩形,包括MDI客户区域。 如果用户想获取MDI客户窗口的矩形,那可能需要不同的方法。但问题明确是“获取客户区的Rect”,所以我假设是CMainFrame的客户区。 回答结构: 1. 解释如何在CMainFrame中获取客户区矩形。 2. 提供代码示例。 3. 确保用中文。 代码示例: - 在CMainFrame的成员函数中,比如OnCreate或自定义函数。 例如: ```cpp void CMainFrame::SomeFunction() { CRect rectClient; GetClientRect(&rectClient); // 获取客户区矩形 // 现在rectClient包含客户区的坐标 } ``` 在MDI应用中,这可能会包括MDI客户窗口的整个区域。 现在,回答后,必须提出3-5个相关问题。问题必须以“§§相关问题§§”开头,并且是连续的一行,不能换行分散。问题编号为1. 2. 3. 等。 相关问题应该基于用户的问题和我的回答。用户的问题是MFC MDICMainFrame获取客户区Rect。 可能的后续问题: 1. 如何获取MDI客户窗口(MDIClient)的矩形? 2. 客户区矩形是否包括工具栏和状态栏? 3. 如何在CMainFrame中调整客户区大小? 4. 在MDI应用中,如何获取活动窗口的客户区? 5. 如何将客户区坐标转换为屏幕坐标? 确保3-5个问题。 最终输出格式: - 回答部分。 - 然后“§§相关问题§§”在单独一行。 - 接着问题列表,每个问题前有编号。 例如: 我的回答... §§相关问题§§ 1. 问题1 2. 问题2 3. 问题3 现在,编译回答。</think>在 MFC MDI文档框架中,`CMainFrame` 类(通常派生自 `CMDIFrameWnd`)是主框架窗口。要获取其客户区矩形(`CRect`),可以使用 `GetClientRect()` 成员函数。该函数继承自 `CWnd` 类,用于获取窗口客户区的坐标(相对于窗口左上角,不包括边框、标题栏、菜单栏、工具栏和状态栏)。在 MDI 应用中,客户区通常包含 MDI 客户窗口(`CMDIChildWnd` 的容器)。 ### 获取客户区 Rect 的步骤: 1. **在 `CMainFrame` 类中添加代码**:例如,在 `OnCreate()` 或其他成员函数中调用。 2. **使用 `GetClientRect()`**:传入 `CRect` 对象或 `RECT` 结构的指针。 3. **示例代码**: ```cpp // 在 CMainFrame 类的成员函数中实现 void CMainFrame::OnSomeCommand() { CRect rectClient; // 定义 CRect 对象存储客户区矩形 GetClientRect(&rectClient); // 获取客户区矩形 // 此时 rectClient 包含客户区的 left, top, right, bottom 值 // 例如:输出或使用 rectClient TRACE("Client Rect: left=%d, top=%d, right=%d, bottom=%d\n", rectClient.left, rectClient.top, rectClient.right, rectClient.bottom); } ``` - **注意事项**: - 在 MDI 框架中,客户区不包括工具栏和状态栏(如果已添加),但包括 MDI 客户窗口区域。 - 如果需要排除 MDI 客户窗口的边框或其他元素,可能需要额外计算。 - 确保在窗口完全创建后调用(如 `OnCreate()` 之后),否则矩形可能无效。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值