版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、COMPANYL O G O第第11章章 单文档与多文档单文档与多文档 高宏建主 要 内 容概述1Doc/View框架的主要成员2SDI编程实例3文件操作中的重要概念4MDI编程实例51 概述1.1单文档界面与多文档界面单文档界面与多文档界面 VCVC的的MFCMFC库支库支持三种不同持三种不同的应用程序的应用程序单文档界面单文档界面(SDI)多文档界面多文档界面(MDI)基于对话框的应用程序基于对话框的应用程序SDI的应用程序的应用程序只有一个窗口只有一个窗口MDI的应用程序每次的应用程序每次可以读写多个文件或可以读写多个文件或文档,可同时对多个文档,可同时对多个文档进行操作,可以文档进行操
2、作,可以有多个子窗口有多个子窗口主主要要差差别别在创建在创建SDI界面的应用程序时,不生成界面的应用程序时,不生成CChildFrame类,类,CMainFrame类的基类类的基类为为CFrameWnd在创建在创建MDI界面的应用程序时,界面的应用程序时,CMainFrame类的基类为类的基类为CMDIFrameWnd使用使用AppWizard创建创建SDI和和MDI界面的应界面的应用程序的过程几乎完用程序的过程几乎完全一样全一样v 单文档实例;v 多文档实例;1.2 文档/视图结构v利用类向导生成单文档和多文档程序框架时,由它所创建的各个类在 一起工作,构成一个相互关联的结构,称为文档/视图
3、结构;v数据的维护和显示-文档类和视图类负责;vCWinAPP类派生的应用程序对象:应用程序的初始化;负责保持文档、视 图、框架窗口类之间的关系,接收windows消息,并进行调度; v框架窗口:提供应用程序的主窗口,包含最大/最小化按钮、标题栏 和系统菜单;v文档的任务:对数据进行维护和管理;v视图的任务:文档和用户的中介,可以将文档类中的数据读取出来进行显示;*MFC程序的运行机制v 应用程序启动时,首先创建应用程序对象theApp(C*App theApp),系统就会先调用基类CWinApp构造函数,进行一系列的内部初始化和启动操作;v 自动调用C*App的虚函数InitInstance
4、(),进一步调用相应的函数来完成主窗口的构造和显示工作。v 调用基类CWinApp的成员函数Run(),执行应用程序的消息循环,即重复执行接收消息并转发消息的工作,若没有消息,利用OnIdle()进行空闲时间的处理。v 当程序结束后,调用基类CWinApp的成员函数ExitInstance(),完成终止应用程序的收尾工作。 *MFC程序的运行机制vCTheApp theApp;vBOOL CTheApp:InitInstance()vv .v m_pMainWnd = new CTheWindow();/调用窗口类的构造函数来创建一个窗口v m_pMainWnd-ShowWindow(SW_S
5、HOW);/显示窗口v m_pMainWnd-UpdateWindow();/更新窗口上的元素v return TRUE;vv v/vint AFXAPI AfxWinMain()vv CWinThread *pThread = AfxGetThread();/获取主线程指针v CWinApp *pApp = AfxGetApp();v AfxWinInit();v .v pApp-InitApplication();v .v pThread-InitInstance();/初始化应用程序实例v .v nReturnCode = pThread-Run();/开始消息循环v1.3 SDI程序中
6、文档、视图对象的创建过程 SDI程序中框架窗口、文档和视图的创建是在应用程序对象的InitInstance()成员函数中通过文档模板类完成的:CSingleDocTemplate * pDocTemplate; /创建单文档模板类对象pDocTemplate = new CsingleDocTemplate(IDR_MAINFRAME, RUNTIME_CLASS (CMyDoc),/CMyDoc是应用程序中的文档类 RUNTIME_CLASS (CMainFrame),/CMainFrame是应用程序中的框架窗口 RUNTIME_CLASS (CMyView) );/CMyView是应用程序
7、中的视图类AddDocTemplate(pDocTemplate); /加载文档模板类对象到文档模板列表CCommandLineInfo cmdInfo;ParseCommandLine(cmdInfo); /初始化CCommandLineInfo对象if(! ProcessShellCommand(cmdInfo) /据对象中的信息启动程序 return FALSE;m_pMainWnd - ShowWindow(SW_SHOW);m_pMainWnd - UpdateWindow();/显示和更新窗口v 系统首先创建单文档模板类,该类的作用是将文档类、视图类和框架窗口类联系在一起进行管理;
8、v RUNTIME_CLASS宏对于所定制的类返回CRuntimeClass的指针,主要目的是使得主结构可以在运行的时候动态创建这些类的对象;v 多文档的文档模板对象为:CMultiDocTemplate;1.4 SDI程序的消息传递过程 当用户选择了菜单项,当用户选择了菜单项,单击了快捷键或工具条单击了快捷键或工具条按钮,系统就会发送按钮,系统就会发送WM_COMMAND消息。框消息。框架窗口实际上是大多数架窗口实际上是大多数WM_COMMAND消息的接消息的接受者,但受者,但WM_COMMAND消息还可以在视图、文消息还可以在视图、文档,甚至应用程序类中档,甚至应用程序类中被处理。被处理。
9、2 Doc/View框架的主要成员框架的主要成员 Doc/View框架虽然可以调用成百上千个框架虽然可以调用成百上千个不同的类,但是核心类只有五个不同的类,但是核心类只有五个: : CWinApp CDocument CView CDocTemplate CFrameWnd 2.1 CWinApp 类类 CWinApp类代表主程序,CWinApp本身是不可见的,它负责维护进程的启动、终止、消息循环、命令行参数、资源管理; 成员成员描述描述InitInstanceInitInstanceMFCMFC程序的入口程序的入口ExitInstanceExitInstanceMFCMFC程序的出口程序的出
10、口m_pszAppName应用程序名M_lpCmdLine命令行参数M_pMainWnd应用程序主窗口指针M_pszExeName可执行文件名M_pszProfileName配置INI文件名M_pszRegistrKey配置注册表主键值LoadCursor加载光标资源LoadIcon加载图标资源部分部分主要主要成员成员程序实例修改新建单文档程序的标题为“这是我的第一个单文档程序“BOOL CMysdiApp:InitInstance() m_pMainWnd-SetWindowText(这是我的第一个单文档程序);m_pMainWnd-ShowWindow(SW_SHOW);m_pMainWn
11、d-UpdateWindow();return TRUE;2.2 CDocument类类 CDocument 的一般方法 方法方法 说明说明 GetTitle(GetTitle() ) 获得文档标题获得文档标题 SetTitle(SetTitle() ) 设置文档标题设置文档标题 GetPathName()GetPathName() 获得文档数据文件的路径字符串获得文档数据文件的路径字符串 SetPathName()SetPathName() 设置文档数据文件的路径字符串设置文档数据文件的路径字符串 GetDocTemplate()GetDocTemplate() 获得指向描述文档类型的文档模
12、板的指针获得指向描述文档类型的文档模板的指针 AddView()AddView() 对与文档相关联的视图列表添加指定的视图对与文档相关联的视图列表添加指定的视图 RemoveView()RemoveView() 从文档视图列表中删除视图从文档视图列表中删除视图 UpdateAllViews()UpdateAllViews() 通知所有视图,文档己被通知所有视图,文档己被修改,应重画修改,应重画 DisconnectViews()DisconnectViews() 使文档与视图相分离使文档与视图相分离 GetFile()GetFile() 获得指向获得指向 CFileCFile 类型的指针类型的
13、指针 CDocument 的的虚虚拟拟方方法法方方法法说说明明O On nN Ne ew wD Do oc cu um me en nt t( () )由由 M MF FC C 调调用用来来建建立立文文档档O On nO Op pe en nD Do oc cu um me en nt t( () )由由 M MF FC C 调调用用来来打打开开文文档档O On nS Sa av ve eD Do oc cu um me en nt t( () )由由 M MF FC C 调调用用来来保保存存文文档档O On nC Cl lo os se eD Do oc cu um me en nt t(
14、() )由由 M MF FC C 调调用用来来关关闭闭文文档档C Ca an nC Cl lo os se eF Fr ra am me e( () )确确定定观观察察文文档档的的框框架架窗窗口口是是否否被被允允许许关关闭闭D De el le et te eC Co on nt te en nt ts s( () )在在未未撤撤消消文文档档对对象象时时删删除除文文档档数数据据R Re el le ea as se eF Fi il le e( () )释释放放文文件件以以允允许许其其它它应应用用程程序序使使用用S Sa av ve eM Mo od di if fi ie ed d( ()
15、)查查询询文文档档的的修修改改状状态态并并存存储储修修改改的的文文档档I Is sM Mo od di if fi ie ed d( () )确确定定文文档档从从它它最最后后一一次次存存储储后后是是否否被被修修订订过过S Se et tM Mo od di if fi ie ed dF Fl la ag g( () )设设置置文文档档从从它它最最后后一一次次存存储储后后是是否否被被修修订订过过的的布布尔尔值值G Ge et tF Fi ir rs st tV Vi ie ew wP Po os si it ti io on n( () )获获得得视视图图列列表表头头的的位位置置G Ge et
16、tN Ne ex xt tV Vi ie ew w( () )获获得得视视图图列列表表的的下下一一个个视视图图最常用的是最常用的是SetModifiedFlag()和和UpdateAllViews()。文档内容被修改。文档内容被修改后,一般要调用后,一般要调用SetModifiedFlag()来设定一个标志。来设定一个标志。UpdateAllViews()刷新所有和文档关联的视图。实际上该函数调用各个视图类的刷新所有和文档关联的视图。实际上该函数调用各个视图类的OnUpdate()函数。这样做可以保证各个视图之间的同步。函数。这样做可以保证各个视图之间的同步。v刷新视图时默认的函数调用过程:
17、CDocument:UpdateAllViews() -CView:OnUpdate() -CWnd:Invalidate() -OnPaint() -OnDraw()2.3 CView类类 视图类(CView)是从CWnd类下派生的 视图类具有CWnd的所有功能如:创建、移动、显示和隐藏窗口等。CView类可以接收任何Windows消息,而CDocument类则不行 IsSelected():确定文档是否被选中确定文档是否被选中OnScroll():当用户滚动时,当用户滚动时,CView的响应的响应OnInitialUpdate():在类第一次构造后由在类第一次构造后由MFC调用调用OnDr
18、aw():由由MFC调用发出文档到设备描述表调用发出文档到设备描述表OnUpdate():由由MFC调用对文档的修改进行响应调用对文档的修改进行响应OnPrepareDC():在调用在调用OnDraw()前允许修改设备描述表由前允许修改设备描述表由MFC调用调用CView主要主要虚拟方法虚拟方法 CView类中最常用的是OnDraw函数,该函数在屏幕发生变化或因为焦点的变化需要重绘时调用,没有该函数,就不可能在程序的切换后保证屏幕的正确显示。 注意: 尽量不要在OnDraw之外的函数调用绘图方法,那些方法不会在视图需要重新绘制的时候被自动调用。 若想在数据更新的时强制视图更新,可调用Inval
19、idate方法和UpdateWindow方法来实现。 v刷新视图时默认的函数调用过程: CDocument:UpdateAllViews() -CView:OnUpdate() -CWnd:Invalidate() -OnPaint() -OnDraw()CEditView:简单的文本编辑器,类似:简单的文本编辑器,类似NotepadCListView:基于列表的视图,类似文件夹浏览:基于列表的视图,类似文件夹浏览CTreeView:基于树状控件的视图,类似文件浏览左侧的树状结构:基于树状控件的视图,类似文件浏览左侧的树状结构CRichEditView:支持多种字体、:支持多种字体、OLE和和
20、RTF格式的高级编辑器格式的高级编辑器CScrollView:支持滚动条的视图:支持滚动条的视图CFormView:窗体视图,支持在上边使用对话框控件:窗体视图,支持在上边使用对话框控件CRecordView:连接到:连接到ODBC数据库的视图数据库的视图CDaoRecordView:连接到:连接到DAO数据库的视图数据库的视图CView的子类的子类2.4 CDocTemplate类类 文档模板类在应用程序中有着非常重要的文档模板类在应用程序中有着非常重要的作用,是它将原本独立的文档、视图和框作用,是它将原本独立的文档、视图和框架窗口对象联系在一起架窗口对象联系在一起 文档模板类负文档模板类负
21、责具体的关联责具体的关联文档、视图、文档、视图、框架的创建框架的创建 在在VC+中,文档对象、与文档对象相关联的视图对象中,文档对象、与文档对象相关联的视图对象以及为视图对象提供显示的框架窗口都是由文档模板创以及为视图对象提供显示的框架窗口都是由文档模板创建的。建的。 每一种文档类型都有一种文档模板与之相对应,文档模每一种文档类型都有一种文档模板与之相对应,文档模板负责创建和管理该文档类型的所有文档。板负责创建和管理该文档类型的所有文档。文档模板的构造函数的原型如下:文档模板的构造函数的原型如下:CDocTemplate(UINT nIDResource, /与文档一同使用的各种资源的资源标识
22、符与文档一同使用的各种资源的资源标识符CRuntimeClass* pDocClass,/ 指向文档派生文档类的对象的指针指向文档派生文档类的对象的指针CRuntimeClass* pFrameClass, /框架类的派生框架类的对象指针框架类的派生框架类的对象指针CRuntimeClass* pViewClass /指向指向CView的派生视图类的对象指针的派生视图类的对象指针 ) 在在SDISDI应用程序中只有一个文档模板对象,应用程序中只有一个文档模板对象,而而MDIMDI应用程序需要针对不同类型的文档定应用程序需要针对不同类型的文档定义不同的文档模板对象。义不同的文档模板对象。当前位置
23、当前位置被访问的位置被访问的位置访问方法访问方法文档文档视图视图GetFirstViewPositionGetNextView文档文档模板模板GetDocTemplate视图视图文档文档GetDocument视图视图框架框架GetParentFrame框架框架视图视图GetActiveView框架框架文档文档GetActiveDocumentMDI主框架主框架 MDI子框架子框架MDIGetActiveMDI子框架子框架 MDI主框架主框架GetParentFrame任何位置任何位置应用程序应用程序AfxGetApp任何位置任何位置主框架主框架AfxGetMainWndDoc/View结构的五
24、个基本成员经结构的五个基本成员经常需要互相访问,假设某个视图常需要互相访问,假设某个视图想要获得文档,或某个框架需要想要获得文档,或某个框架需要获得活动视图,可以通过此表提获得活动视图,可以通过此表提供的方法进行解决供的方法进行解决 2.5 CFrameWnd类类 CFrameWnd类在类在Doc/View结构中起着结构中起着举足轻重的作用。举足轻重的作用。 框架窗口维护了很多幕后的工作,框架窗口维护了很多幕后的工作,例如工具条、菜单、状态条的显示、更例如工具条、菜单、状态条的显示、更新,视图的位置和显示,其它可停靠空新,视图的位置和显示,其它可停靠空间的停靠和动态尺寸调整。许多默认为间的停靠
25、和动态尺寸调整。许多默认为MFC应用程序应该具备的基本功能都是应用程序应该具备的基本功能都是CFrameWnd类在完成类在完成 3 SDI编程实例编程实例 【例例11-1】在主窗在主窗口中央显示一文口中央显示一文本本“您好您好, 单文档单文档界面的例程界面的例程!”。单。单击击“改变显示文改变显示文本本”菜单项菜单项,可可弹出一个对话框,弹出一个对话框,通过此对话框可通过此对话框可改变主窗口中的改变主窗口中的显示文本内容显示文本内容 1.创建单文档应用程序MySDI;2.添加菜单: caption:改变显示文本 ID:ID_EDIT_CHANGETEXT3.添加对话框: 对话框中添加编辑框:
26、ID:IDC_EDIT1 关联变量:m_input,类型CSring4.为对话框添加新类名:CDlgInput5 为为CMySdiDoc类添加成员变量类添加成员变量 在在CMySdiDoc类的定义中增加如下的代码:类的定义中增加如下的代码: PUBLIC: CString m_str;用以存放用以存放字符串字符串6 文档变量初始化文档变量初始化打开CMySdiDoc.cpp文件,在 OnNewDocument成员函数加入以下代码:BOOL CMySdiDoc:OnNewDocument()if (!CDocument:OnNewDocument()return FALSE;m_str=“您好,
27、单文档界面的例程!”/初始化成员变量return TRUE;7 视图的输出视图的输出 MySdi程序视图类程序视图类CMySdiView类的类的OnDraw成员函数:成员函数:void CMySdiView:OnDraw(CDC* pDC) CMySdiDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); CRect rectClient; GetClientRect(rectClient); / 获取当前客户区的指针获取当前客户区的指针 CSize sizeClient=rectClient.Size();/ 获取当前客户区的大小获取当前客户区的大小
28、CString str=pDoc-m_str;/ 从文件中读取数据从文件中读取数据 CSize sizeTextExtent=pDC-GetTextExtent(str);/ 用新选定的字体绘制字符串用新选定的字体绘制字符串 pDC-TextOut(sizeClient.cx-sizeTextExtent.cx)/2,(sizeClient.cy-sizeTextExtent.cy)/2,str);调用调用GetDocument()得到文档类的指针,得到文档类的指针,将文档对象成将文档对象成员变量复制到字符串员变量复制到字符串str中中,调用,调用TextOut()将将m_str的内的内容显示
29、到框架窗口中的视图中。容显示到框架窗口中的视图中。8 文档串行化文档串行化 在在 “编辑编辑” 菜单中添加菜单项菜单中添加菜单项“改变显示文改变显示文本本” (ID_EDIT_CHANGETEXT )。单击此。单击此菜单项可以将将对视图中显示文本所做的修改菜单项可以将将对视图中显示文本所做的修改保存到一个磁盘文件中,具体的实现方法如下:保存到一个磁盘文件中,具体的实现方法如下:void CMySdiDoc:OnEditChangetext() CDlgInput inputDlg;/创建一个创建一个 CInputDlg类的对象类的对象inputDlg if(inputDlg.DoModal()
30、=IDOK)/显示对话框显示对话框 m_str=inputDlg.m_input;/获取输入的字符串获取输入的字符串UpdateAllViews(NULL);/更新视图更新视图 为了在为了在CMySdiDoc类中定义对话框类类中定义对话框类CDlgInput对象,对象,还必须在还必须在MySdiDoc.cpp文件中加入文件中加入CDlgInput类的头类的头文件文件DlgInput.h,代码如下:,代码如下: #include DlgInput.h/加入头文件加入头文件 为了把这些修改保存到磁盘文件中,并在需要时为了把这些修改保存到磁盘文件中,并在需要时可以打开所保存的磁盘文件读取文档,需要重
31、载可以打开所保存的磁盘文件读取文档,需要重载CExampleDoc类的类的Serialize函数来完成串行化。重载函数来完成串行化。重载后的后的Serialize函数的代码如下:函数的代码如下:void CMySdiDoc:Serialize(CArchive& ar)if (ar.IsStoring()arm_str;/读取文档内容读取文档内容 4 文档操作中的一些重要概念文档操作中的一些重要概念 串行化处理串行化处理文档文档操作操作文档的消息映射文档的消息映射文档消息传递文档消息传递文件打开文件打开文件保存文件保存4.1 串行化处理串行化处理 串行化:串行化:将对象写入字节流和从字
32、节流恢复对将对象写入字节流和从字节流恢复对象的操作象的操作 串行化除了可以使用文件保存对象之外,还可以通过网络、串口传输对象,因此使用字节流。串行化代码如下:void CMDIDoc:Serialize(CArchive& ar) if (ar.IsStoring() / TODO: add storing code hereelse / TODO: add loading code here 使用串行化的好处是不需要重载文件打开、文件保存之类的方法,MFC框架会自动完成这些任务,并自动调用文档类的Serialize方法来完成串行化过程。 如果文档的抽象数据只有一个字符串,那么你只需要
33、在Serialize中添加相映语句就可以完成串行化过程。 如果不使用MFC提供的串行化框架,那么就需要重载一些函数,来获取文件名,然后自己来读写文件完成对象的串行化。在进行串行化处在进行串行化处理时,通常是通理时,通常是通过过CArchive(档案档案)类来完成的类来完成的成员成员描述描述WriteString写入字符串写入字符串ReadString读取字符串读取字符串ReadClass读取类信息读取类信息WriteClass写入类信息写入类信息Close关闭档案关闭档案GetObjectSchema读取对象版本号读取对象版本号SetObjectSchema设置对象版本号设置对象版本号M_pD
34、ocument使用该档案的文档使用该档案的文档Read读取字节内容读取字节内容Write写入字节内容写入字节内容GetFile获取底层的获取底层的CFile对象对象operator从流中读取基本类型从流中读取基本类型IsStoring是否处于保存状态是否处于保存状态Flush将缓冲中的数据强制写入流中将缓冲中的数据强制写入流中Abort在不发送异常的情况下关闭档案在不发送异常的情况下关闭档案ReadObject读取串行化对象读取串行化对象WriteObject写入串行化对象写入串行化对象CArchive类的类的常用成员常用成员 若使用串行化,可以不关心若使用串行化,可以不关心文件打开关闭的具体
35、过程,文件打开关闭的具体过程,只需要完善只需要完善Serialize方法即方法即可,但是很多应用程序都希可,但是很多应用程序都希望来亲自控制用户打开保存望来亲自控制用户打开保存文件的过程文件的过程 缺省处理方法缺省处理方法CWinApp:OnFileOpenCWinApp:OpenDocumentFileCDocTemplate:OpenDocumentFileCDocument:OnOpenDocumentCDocument:SerializeCDocument:OnFileSave/OnFileSaveAsCDocument:OnSaveDocument文件打开或保存文件打开或保存时重载的
36、某一个时重载的某一个缺省处理方法缺省处理方法打开文件的“所有工作”v显示获取文件名对话框v选择匹配文件的模板v创建关联框架、文档和视图对象v打开该文件v将文件与档案绑定v调用Serialize4.2 消息映射消息映射 使用使用ClassWizard来添加消息映射,但来添加消息映射,但有时,有时,ClassWizard不支持某些类的消息不支持某些类的消息映射,需自己添加一些自定义的消息,映射,需自己添加一些自定义的消息,这时都需要手工添加消息映射代码这时都需要手工添加消息映射代码 数组中数组中存储的存储的信息信息消息应用于的控件消息应用于的控件ID,或者,或者ID范围范围所处理的消息所处理的消息
37、消息所传递的参数消息所传递的参数消息所期望的返回值消息所期望的返回值 消息映射本质上就消息映射本质上就是一个数组,是一个数组,MFC使用该数组来确定使用该数组来确定消息传递时具体要消息传递时具体要传递给哪一个函数传递给哪一个函数 当当MFC收到消息后,便自动确定目标窗口收到消息后,便自动确定目标窗口和相应的和相应的MFC类的实例。然后它便搜索窗口的类的实例。然后它便搜索窗口的消息映射寻找匹配的项。若窗口中没有处理该消息映射寻找匹配的项。若窗口中没有处理该消息的处理程序,消息的处理程序,MFC便进一步搜索窗口的父便进一步搜索窗口的父类。如果父类也没有找到处理该消息的函数,类。如果父类也没有找到处
38、理该消息的函数,MFC便将消息传递给该窗口的原窗口过程便将消息传递给该窗口的原窗口过程 在消息映射的时候,仅仅靠在消息映射的时候,仅仅靠ClassWizard生成的宏是不够生成的宏是不够的,有时需要向已有的消息映射添加自己的宏,但所添加的的,有时需要向已有的消息映射添加自己的宏,但所添加的宏一定要放在宏一定要放在ClassWizard的特殊注释之外。的特殊注释之外。 以下是由以下是由AppWizard产生的默认产生的默认MDI视图的消息映射,另外添视图的消息映射,另外添加了一个菜单项的处理和一个加了一个菜单项的处理和一个WM_ERASEBKGND消息的映射:消息的映射: BEGIN_MESSA
39、GE_MAP(CMDIView, CView) /AFX_MSG_MAP(CMDIView) ON_COMMAND(ID_OPER_TEST, OnOperTest) ON_UPDATE_COMMAND_UI(ID_OPER_TEST, OnUpdateOperTest) ON_WM_ERASEBKGND() /AFX_MSG_MAP / Standard printing commands ON_COMMAND(ID_FILE_PRINT, CView:OnFilePrint) ON_COMMAND(ID_FILE_PRINT_DIRECT, CView:OnFilePrint) ON_CO
40、MMAND(ID_FILE_PRINT_PREVIEW, CView:OnFilePrintPreview)END_MESSAGE_MAP() 位于位于AFX_MSG_MAP之间的宏来自之间的宏来自ClassWizard特定宏特定宏 ON_COMMAND是通用宏是通用宏在第二个在第二个AFX_MSG_MAP之后,可以添加自己的之后,可以添加自己的消息映射,消息映射,ClassWizard不检查这里,这里的消不检查这里,这里的消息映射不会出现在息映射不会出现在ClassWizard中的中的 4.3 消息传递消息传递 由于用户可以在很多由于用户可以在很多MFC类中映射同一个类中映射同一个消息,如可
41、以在文档和视图中同时映射消息,如可以在文档和视图中同时映射打开文件的消息,这样就需要消息有明打开文件的消息,这样就需要消息有明确的来源,也有明确的接收者,因此需确的来源,也有明确的接收者,因此需要判断消息传递的顺序。要判断消息传递的顺序。 当前视图当前视图当前文档当前文档与当前视图与当前视图/ /文档关文档关联的文档模板联的文档模板子框架窗口(只有子框架窗口(只有MDIMDI有该有该步骤)步骤)主框架窗口主框架窗口应用程序对象应用程序对象5 MDI编程实例编程实例 【例例16-216-2】创建多文档的应用程序,可以打开两种类型的文档。创建多文档的应用程序,可以打开两种类型的文档。MyMdi1M
42、yMdi1是系统默认生成的文档是系统默认生成的文档( (可以打印可以打印) )。MyMdi21MyMdi21是另一个是另一个用户添加的文档类型用户添加的文档类型( (不允许打印不允许打印) ),在程序窗口中显示,在程序窗口中显示“您好您好, , 多文档界面的例程多文档界面的例程!”!”, 注意如果活动文档的注意如果活动文档的 类型改变,则菜单的类型改变,则菜单的 “ “编辑编辑”项的子菜单不项的子菜单不 同,工具条上同,工具条上“打印打印” 按钮的激活状态也不按钮的激活状态也不 同同(1) 创建创建MDI工程文件工程文件 创建创建MyMdi工程文件,工程文件,在在Step 4 of 6 的窗口
43、中,的窗口中,单击单击Advanced按钮,在按钮,在File extention对话框中加对话框中加入入mmd,完成后的应用,完成后的应用程序的文件将使用程序的文件将使用“.mmd”为扩展名为扩展名,文文件过滤器域显示为件过滤器域显示为“MyMdi文件文件(*.mmb)”,在在Step 6 of 6 的对话框中,的对话框中,为为CMyMdiView类设置基类设置基类为类为CEditView。(2)创建第二种文档和视图类创建第二种文档和视图类View ClassWizard Class Info Add Class New (3) 创建资源创建资源 在在Resource.h文件中,手工加入下列
44、代码文件中,手工加入下列代码:#define IDR_MYMDITYPE2 135 这样就定义了第二类文档的文档、视图和框架窗这样就定义了第二类文档的文档、视图和框架窗口共同的资源口共同的资源ID,以后定义的菜单、文档模板等资,以后定义的菜单、文档模板等资源均可以使用此源均可以使用此ID文档模板字符串的格式如下:文档模板字符串的格式如下:nIDResource nnnnnnn对于第一个文档,应用程序向导直接产生了一对于第一个文档,应用程序向导直接产生了一个文档模板,现在必须手工加入第二个资源模个文档模板,现在必须手工加入第二个资源模板字符串。具体的方法是:打开板字符串。具体的方法是:打开MyM
45、di.rc文件,文件,首先找到如下代码:首先找到如下代码:IDR_MYMDITYPE nMyMdi nMyMdi nMyMdi 文件文件 (*.mmd) n.mmd nMyMdi.Document nMyMdi Document在上面代码的后面加入在上面代码的后面加入:IDR_MYMDITYPE2 nMyMdi2 nMyMdi2 nMyMdi2 文件文件 (*.mm2) n.mm2 nMyMdi2.Document nMyMdi2 Document类似第一个类似第一个资源模板的资源模板的格式格式(3) 菜单、对话框资源菜单、对话框资源 单击MyMdi resources中的Menu,将菜单ID
46、R_MYMDITYPE复制一份,复制的新菜单ID为IDR_MYMDITYPE2,在新菜单中为“编辑”菜单添加一个菜单项“改变显示文本”,该菜单项ID为ID_EDIT_CHANGETEXT. 为该程序添加新对话框,与SDI例子中相同,为其添加新类CDlgInput,并为其中的Edit Box控件(ID为IDC_EDIT1)添加相关联的成员变量m_input,其类型为CString。(4) 代码编辑代码编辑(a) 创建文档模板类创建文档模板类 本程序支持多种文档,在应用程序的本程序支持多种文档,在应用程序的InitInstance()函数中,需函数中,需要定义新的文档模板的对象,在要定义新的文档模
47、板的对象,在MyMdi.cpp中输入代码如下:中输入代码如下:BOOL CMyMdiApp:InitInstance() CMultiDocTemplate* pDocTemplate2; pDocTemplate2 = new CMultiDocTemplate(IDR_MYMDITYPE2,RUNTIME_CLASS(CMyMdiDoc2), / MDI派生文档类的派生文档类的CRuntimeClass对象的指针对象的指针RUNTIME_CLASS(CChildFrame), / MDI派生子框架类的派生子框架类的CRuntimeClass对象的指针对象的指针RUNTIME_CLASS(C
48、MyMdiView2);/ 创建文档模板对象创建文档模板对象AddDocTemplate(pDocTemplate2);/将新模板添加到应用程序的文档模板列表中将新模板添加到应用程序的文档模板列表中为使为使CMyMdiDoc2类和类和CMyMdiView2类在类在CMyMdiApp类中成为可识别的类,必须在类中成为可识别的类,必须在MyMdiApp.cpp文件中加入文件中加入CMyMdiDoc2类和类和CMyMdiView2类的说明头文件类的说明头文件MyMdiDoc2.h和和MyMdiView2.h/ MyMdiApp.cpp : implementation of the CMyMdiAp
49、p class#include MyMdiDoc2.h/加入头文件加入头文件#include MyMdiView2.h(b) 扩展扩展CMyMdiDoc2类类 添加成员变量:添加成员变量:在类在类CMyMdiDoc2中增加中增加Cstring类型的成员变量类型的成员变量m_str文档变量初始化:文档变量初始化:为了能够在第二个文档中显示为了能够在第二个文档中显示“您好您好, 多文档界面的例多文档界面的例程程!”,需在,需在CMyMdiDoc2类的类的OnNewDocument()成员成员函数中为变量函数中为变量m_str赋初值。因此需添加下列代码:赋初值。因此需添加下列代码: BOOL CMyMdiDoc2:OnNewDocument()if (!CDocument:OnNewDocument()return FALSE;m_str=您好您好, 多文档界面的例程多文档
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 兴趣定向广告行业相关项目经营管理报告
- 电动扳手项目营销计划书
- 单板滑雪训练行业经营分析报告
- 体操鞋产品供应链分析
- 可重复使用的医疗器械行业市场调研分析报告
- 对体育运动参与者的药物测试行业相关项目经营管理报告
- 农用化学品研究服务行业营销策略方案
- 健康保险行业相关项目经营管理报告
- 医疗设备再处理行业相关项目经营管理报告
- 压缩抽吸和运送谷物用鼓风机产业链招商引资的调研报告
- (南京专版)江苏省南京市2023-2024学年三年级数学上册期中综合素养测评调研试卷(苏教版)
- 2022-2023学年北京西城区北师大附初二期中(上)物理试卷及答案
- 2022年湖南省衡南县五科联赛数学试卷
- 布氏硬度对照表
- 小学数学解题研究全套教学课件
- 精算模型真题模拟汇编(共704题)
- 急性脑梗死的桥接治疗课件
- 《中国工艺美术史》考研备考题库(知识点整理)
- 人民医院神经外科临床技术操作规范2023版
- 人教鄂教版六年级科学上册全册教学设计教案
- 《做自己的心理医生 现代人的心理困惑和自我疗愈策略》读书笔记思维导图PPT模板下载
评论
0/150
提交评论