MFC MDI

来源:互联网 发布:开一个话费充值淘宝店 编辑:程序博客网 时间:2024/05/21 16:58
 
 
MFC MDI
 
Document Interface) Windows 范,览文据,Windows Program Manager MDI 的。中,许法。(Microsoft Foundation Class Library, MFC ), 便Windows 类库。MFC Windows APIVC++ MFC 目前Windows 便一。VC++ AppWizardClassWizard App Studio, Windows (Framework)做的去,作量,度。MDI Windows 籍,利用MFC MDI 面。

  MFC 2.0 / ”(Document/View) 式。据,浏互,离,使具规化、化。MFC 中,CDocument ( Doc )CView ( View )中,理。使文档时,CFrameWnd 现;使时,CMDIFrameWnd CMDIChildWnd 现。档、来。

  App Wizard Option Multiple Document Interface 时,MFC 架程(Framework) MDI 码。CMDIFrameWnd 的主口;CMDIChildWnd MDI 架,项,单。主项。CView MDI 的具容。如,App Wizard M01 Project (framework) 基本类:CMainFrameCMDIFrameWndCM01Doc CDocument窗口CM01ViewCViewCM01DocCM01View CMDIChildWnd CMultiDocTemplate 起。CM01App::InitInstance() 下:

  BOOL CM01App::InitInstance()

  {

  ......

   CMultiDocTemplate* pDocTemplate;

   // CMultiDocTemplate 用 于MDI 文 档

   pDocTemplate = new CMultiDocTemplate(

   IDR_M01TYPE,// 资 源 标 识

   RUNTIME_CLASS(CM01Doc),

   // 文 档 类

   RUNTIME_CLASS(CMDIChildWnd),

   // 标 准MDI 子 窗 口 框 架

   RUNTIME_CLASS(CM01View));

   // 浏 览 视 窗 类

   AddDocTemplate(pDocTemplate);

   // 为 整 个 应 用 程 序 添 加 新 模 板

  ......

  }

  时,Doc View 联,MDI 的。希望档,项、类、View 类,且用CMDIChildWnd 可。MFC 隐藏来,排。据,View OnDraw() 数,制。

  中,示,值,又示。Doc View 联,View MDI 口。CMultiDocTemplate View 象。CMultiDocTemplate 使View 类。

  (1) ClassWizard View 类:CM02View

  (2) 板:

  CMultiDocTemplate* pDocTemplate02=new CMultiDocTemplate(

   IDR_M01TYPE, // 使

   RUNTIME_CLASS(CM01Doc), //

   RUNTIME_CLASS(CMDIChildWnd), // MDI

   RUNTIME_CLASS(CM02View)); // View

  使CApp::AddDocTemplate 板。

  CM01App::InitInstance() 板,为程型,EXE 框,类型。的。

  况,使MFC 法:下,先,App Studio 将字IDR_M01TYPE IDR_M02TYPE后,IDR_M02TYPE
M01 Document( CDocTemplate::fileNewName )后,IDR_M02TYPE 板。EXE 框。MFC 后,所以框,CM01App::InitInstance() OnFileNew() 数。OnFileNew() 量;时,框;后,类型MDI 口。fileNewName 项,型,对话框,MDI 口。

  中,OnFileNew() ( File New 应,)CMyApp::InitInstance() 板,躲过OnFileNew() 查,板,口。避免框,源。

  下:立;(NewWindow)”,在CMainFrame 息,口。

  void CMainFrame::OnNewWindow()

  {

   // 添 加 新 的 文 档 模 板

   static CMultiDocTemplate* pDocTemplate_New;

   static BOOL bChildCreated=FALSE;

   // 标 志, 新 窗 口 是 否 建 立; 如 已 建, 将 不 重 建

   if(bChildCreated==FALSE)

   {

   pDocTemplate_New = new CMultiDocTemplate(

   IDR_M01TYPE, // 使 用 同 一 资 源

   RUNTIME_CLASS(CM01Doc),

   RUNTIME_CLASS(CMDIChildWnd),

   // 标 准MDI 子 窗 口 框 架

   RUNTIME_CLASS(CM02View));

   AfxGetApp()->AddDocTemplate(pdocTemplate_New);

   // 创 建 新 的 子 窗 口

   CMDIChildWnd* pMDIActive = MDIGetActive(); // 获 得 当 前 活 动 子 窗 口 的 指 针

   CMpvDoc* pDoc = (CMpvDoc*)pMDIActive->GetActiveDocument(); // 获 得 文 档 指 针

   CMDIChildWnd* pNewFrame=(CMDIChildWnd*) (pDocTemplate_New ->CreateNewFrame(pDoc, NULL));

  // 建 立 新 的 框 架 窗 口

   if (pNewFrame == NULL)

   {

   AfxMessageBox(" 新 窗 口 不 能 建 立",MB_OK,0);

   return; // not created

   }

  pDocTemplate_New ->InitialUpdateFrame(pNewFrame, pDoc); // 显 示 窗 口

  MDITile(MDITILE_HORIZONTAL); // 将 多 个 窗 口 平 铺

  bChildCreated=TRUE;

  }

   不 同 的View 在OnDraw() 函 数 中 有 各 自 的 绘 制 代 码, 当 数 据 更 新 时, 只 要 调 用CDocument::UpdateAllViews() 函 数, 即 可 更 新 全 部 的MDI 子 窗 口。

   以 上 所 讨 论 的 程 序 在Windows 3.1、 中 文 之 星2.0、 VC++ 1.52、MFC 2.50 环 境 下 通 过。 从 中可 以 看 到: 利 用MFC 实 现MDI, 将 复 杂 的 多 窗 口 安 排 交 给 框 架 程 序(Framework) 来 承 担, 编 程 人 员可 将 精 力 集 中 于 自 己 特 有 的 任 务, 极 大 地 提 高 了 编 程 的 效 率。