VC++技术内幕(第四版)笔记(第17章)

/*************************************/

第十七章:读和写文档--MDI应用程序


1, MFC库中CMDIFrameWnd类封装了主框架窗口和MDI客户窗口所有的函数(包含了所有Windows MDI消息的消息控制函数),因而完全可以管理它的子窗口(由CMDIChildWnd类对象来表示的)。

2,MDI应用程序中,任何时候只有一个子窗口处于活动状态。MDI应用程序只有以个 菜单和工具栏,其上的所有的命令都被传递到当前活动子窗口中。主窗口的标题栏中显示活动窗口的文档文件名。

3,MDI应用程序在启动次序上和SDI程序大部分相同。MDI中被派生类中重载的InitInstance函数与SDI有所不同。(具体的不同跟踪下代码或见362页啊,我就不抄了)

4,MDI应用程序实质:一个MDI应用程序可以使用多个文档类型,并允许同时存在不止一个的文档对象。
比较:
SDI中:
 CSingleDocTemplate* pDocTemplate;
 pDocTemplate = new CSingleDocTemplate(
  IDR_MAINFRAME,
  RUNTIME_CLASS(CStudentDoc),
  RUNTIME_CLASS(CMainFrame),       // main SDI frame window
  RUNTIME_CLASS(CStudentView));
 AddDocTemplate(pDocTemplate);

MDI中:
 CMultiDocTemplate* pDocTemplate;
 pDocTemplate = new CMultiDocTemplate(
  IDR_EX17ATYPE,
  RUNTIME_CLASS(CStudentDoc),
  RUNTIME_CLASS(CChildFrame), // custom MDI child frame
  RUNTIME_CLASS(CStudentView));
 AddDocTemplate(pDocTemplate);
//MDI中AddDocTemplate(pDocTemplate)的调用使得MDI应用程序能够支持多个子窗口,而每个子窗口都与一个文档对象和一个视图对象相连接。若干个子窗口(及其相应的视图对象)也可能与一个文档对象相连接。
//MDI动态的创建CChildFrame对象。

5,SDI只能有一个框架窗口类和一个框架窗口对象(CMainFrame:CFrameWnd);MDI应用程序有两个框架窗口类,并且可以有多个框架对象,即:
CMainFrame:CMDIFrameWnd  只有一个对应对象        有菜单和控制栏   无视图
CChildFrame:CMDIChildWnd 每个子窗口对应一个对象  无菜单和控制栏   有视图
对象的创建:CMainFrame对象在应用程序类的InitInstance函数中(即CMainFrame* pMainFrame = new CMainFrame;);CChildFrame对象是当新的子窗口被打开时,由应用程序框架来创建(MDI中InitInstance函数中ProcessShellCommand的调用用以创建子框架)。

6,MDI的InitInstance函数将CWinApp::m_pMainWnd设置成指向应用程序的主框架窗口指针。因而任何时候可以通过AfxGetApp函数来访问m_pMainWnd。

7,一个MDI程序包含两个独立的字符串资源,分别由IDR_MAINFRAME和IDR_EX17ATYPE(视具体的项目变化)来标识的。(详细见P361-362)

8,创建新文档 和 为现有的文档创建新视图(参见362页,很多条款也不抄了)

9,MDI应用程序每次当文档文件从磁盘中载入的时候,都会构造新的文档对象,并且当子窗口被关闭的时候,相应的文档对象被删除。(问题:如果多个子窗口与同一个文档对象相连接,那当一个子窗口被关闭,关联的文档对象会不会同时被删除呢?)

10,SDI中不支持多次AddDocTemplate调用(SDI中在应用程序生存周期内,文档对象、视图对象、框架对象只被创建一次),而MDI中却是通过多次调用AddDocTemplate来支持多个文档模板,每个模板可制定不同的文档类、视图类以及MDI子框架类的组合。


(注:本章笔记有点粗糙,实例也只看了看没跟踪多少代码,以后找个好实例再补上,时间关系,笔记暂停了些时日,见谅哦)
/

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值