单文档多文档编程详解
合集下载
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
2 Doc/View框架的主要成员 框架的主要成员
Doc/View框架虽然可以调用成百上千个 框架虽然可以调用成百上千个 不同的类,但是核心类只有五个: 不同的类,但是核心类只有五个: CWinApp CDocument CView CDocTemplate CFrameWnd
2.1 CWinApp 类
当用户选择了菜单项, 当用户选择了菜单项, 单击了快捷键或工具条 按钮, 按钮,系统就会发送 WM_COMMAND消息。框 消息。 消息 架窗口实际上是大多数 WM_COMMAND消息的接 消息的接 受者, 受者,但WM_COMMAND 消息还可以在视图、 消息还可以在视图、文 档,甚至应用程序类中 被处理。 被处理。
CDocument 的虚拟方法 说明 由 MFC 调用来建立文档 调用来建立文档 建立 由 MFC 调用来打开文档 调用来打开文档 打开 调用来保存 保存文档 由 MFC 调用来 保存 文档 调用来关闭 关闭文档 由 MFC 调用来 关闭 文档 确定观察文档的框架窗口是否被允许关闭 在未撤消文档对象时删除文档数据 释放文件以允许其它应用程序使用 查询文档的修改状态并存储修改的文档 确定文档从它最后一次存储后是否被修订过 设置文档从它最后一次存储后是否被修订过的布尔值 获得视图列表头的位置 获得视图列表的下一个视图
单文档实例;
多文档实例;
1.2 文档/视图结构
利用类向导生成单文档和多文档程序框架时,由它所创建的各个类在 一起工作,构成一个相互关联的结构,称为文档/视图结构; 数据的维护和显示---文档类和视图类负责;
CWinAPP类派生的应用程序对象:应用程序的初始化;负责保持文档、视 图、框架窗口类之间的关系,接收windows消息,并进行调度; 框架窗口:提供应用程序的主窗口,包含最大/最小化按钮、标题栏 和系统菜单; 文档的任务:对数据进行维护和管理; 视图的任务:文档和用户的中介,可以将文档类中的数据读取出来进行显示;
CWinApp类代表主程序,CWinApp本身是不可见的,它负责维 护进程的启动、终止、消息循环、命令行参数、资源管理;
成员 InitInstance ExitInstance m_pszAppName M_lpCmdLine M_pMainWnd M_pszExeName M_pszProfileName M_pszRegistrKey LoadCursor LoadIcon
***MFCΒιβλιοθήκη 序的运行机制应用程序启动时,首先创建应用程序对象theApp(C***App theApp), 系统就会先调用基类CWinApp构造函数,进行一系列的内部初始化和 启动操作;
自动调用C***App的虚函数InitInstance(),进一步调用相应的函数 来完成主窗口的构造和显示工作。
描述 MFC程序的入口 MFC程序的入口 MFC程序的出口 MFC程序的出口 应用程序名 命令行参数 应用程序主窗口指针 可执行文件名 配置INI文件名 配置注册表主键值 加载光标资源 加载图标资源
部分 主要 成员
程序实例
修改新建单文档程序的标题为“这是我的第一个单文档程序 “
BOOL CMysdiApp::InitInstance() { …………… m_pMainWnd->SetWindowText("这是我的第一个单文档程序"); m_pMainWnd->ShowWindow(SW_SHOW); m_pMainWnd->UpdateWindow(); return TRUE; }
最常用的是SetModifiedFlag()和UpdateAllViews()。文档内容被修改 和 最常用的是 。 一般要调用SetModifiedFlag()来设定一个标志。UpdateAllViews() 来设定一个标志。 后,一般要调用 来设定一个标志 刷新所有和文档关联的视图。 刷新所有和文档关联的视图。实际上该函数调用各个视图类的 OnUpdate()函数。这样做可以保证各个视图之间的同步。 函数。 函数 这样做可以保证各个视图之间的同步。
… CCommandLineInfo cmdInfo; ParseCommandLine(cmdInfo); //初始化CCommandLineInfo对象 if(! ProcessShellCommand(cmdInfo)) //据对象中的信息启动程序 return FALSE; m_pMainWnd -> ShowWindow(SW_SHOW); m_pMainWnd -> UpdateWindow(); //显示和更新窗口
2.2
CDocument类 类
CDocument 的一般方法 方法 GetTitle() GetTitle() SetTitle() SetTitle() GetPathName() SetPathName() GetDocTemplate() AddView() RemoveView() UpdateAllViews() DisconnectViews() GetFile() 说明 获得文档标题 设置文档标题 获得文档数据文件的路径字符串 设置文档数据文件的路径字符串 获得指向描述文档类型的文档模板的指针 对与文档相关联的视图列表添加指定的视图 从文档视图列表中删除视图 通知所有视图,文档己被修改 修改, 通知所有视图,文档己被修改,应重画 使文档与视图相分离 获得指向 CFile 类型的指针
CView类中最常用的是OnDraw函数,该函数 在屏幕发生变化或因为焦点的变化需要重绘时 调用,没有该函数,就不可能在程序的切换后 保证屏幕的正确显示。 注意: 尽量不要在OnDraw之外的函数调用绘 图方法,那些方法不会在视图需要重新绘制的 时候被自动调用。 若想在数据更新的时强制视图更新,可调用 Invalidate方法和UpdateWindow方法来实现。
在创建SDI界面的应用程序时,不生成 界面的应用程序时, 在创建 界面的应用程序时 CChildFrame类,CMainFrame类的基类 类 类的基类 为CFrameWnd 在创建MDI界面的应用程序时, 界面的应用程序时, 在创建 界面的应用程序时 CMainFrame类的基类为 类的基类为 CMDIFrameWnd
1.3 SDI程序中文档、视图对象的创建过程
SDI程序中框架窗口、文档和视图的创建是在应用程序对象的 InitInstance()成员函数中通过文档模板类完成的: CSingleDocTemplate * pDocTemplate; //创建单文档模板类对象
pDocTemplate = new CsingleDocTemplate (IDR_MAINFRAME, RUNTIME_CLASS (CMyDoc), //CMyDoc是应用程序中的文档类 RUNTIME_CLASS (CMainFrame), //CMainFrame是应用程序中的框架窗口 RUNTIME_CLASS (CMyView) ); //CMyView是应用程序中的视图类 AddDocTemplate(pDocTemplate); //加载文档模板类对象到文档模板列表
刷新视图时默认的函数调用过程:
CDocument::UpdateAllViews() ---CView::OnUpdate() ---CWnd::Invalidate() ---OnPaint() ---OnDraw()
CEditView:简单的文本编辑器,类似Notepad :简单的文本编辑器,类似 CListView:基于列表的视图,类似文件夹浏览 :基于列表的视图, CTreeView:基于树状控件的视图,类似文件浏览左侧的树状结构 :基于树状控件的视图, CRichEditView:支持多种字体、OLE和RTF格式的高级编辑器 :支持多种字体、 和 格式的高级编辑器 CScrollView:支持滚动条的视图 : CFormView:窗体视图,支持在上边使用对话框控件 :窗体视图, CRecordView:连接到 :连接到ODBC数据库的视图 数据库的视图 CDaoRecordView:连接到 :连接到DAO数据库的视图 数据库的视图
系统首先创建单文档模板类,该类的作用是将文档类、 视图类和框架窗口类联系在一起进行管理;
RUNTIME_CLASS宏对于所定制的类返回CRuntimeClass的 指针,主要目的是使得主结构可以在运行的时候动态创 建这些类的对象;
多文档的文档模板对象为:CMultiDocTemplate;
1.4 SDI程序的消息传递过程
方法 OnNewDocument() OnOpenDocument() OnSaveDocument() OnCloseDocument() CanCloseFrame() DeleteContents() ReleaseFile() SaveModified() sModified() IsModified () etModifiedFlag() SetModifiedFlag() GetFirstViewPosition() GetNextView()
调用基类CWinApp的成员函数Run(),执行应用程序的消息循环,即重 复执行接收消息并转发消息的工作,若没有消息,利用OnIdle()进 行空闲时间的处理。
当程序结束后,调用基类CWinApp的成员函数ExitInstance(),完成 终止应用程序的收尾工作。
***MFC程序的运行机制
CTheApp theApp; BOOL CTheApp::InitInstance() { .... m_pMainWnd = new CTheWindow();//调用窗口类的构造函数来创建一个窗口 m_pMainWnd->ShowWindow(SW_SHOW);//显示窗口 m_pMainWnd->UpdateWindow();//更新窗口上的元素 return TRUE; } ////////////// int AFXAPI AfxWinMain() { CWinThread *pThread = AfxGetThread();//获取主线程指针 CWinApp *pApp = AfxGetApp(); AfxWinInit(); .... pApp->InitApplication(); ... pThread->InitInstance();//初始化应用程序实例 ... nReturnCode = pThread->Run();//开始消息循环 }
第11章 单文档与多文档 章
高宏建
COMPANY
LOGO
主要内容
1 2 3 4 5
概述 Doc/View框架的主要成员 SDI编程实例 文件操作中的重要概念 MDI编程实例
1 概述
1.1单文档界面与多文档界面 单文档界面与多文档界面 SDI的应用程序 的应用程序 只有一个窗口
单文档界面(SDI) 单文档界面 VC的MFC库支 VC的MFC库支 持三种不同 的应用程序 多文档界面(MDI) 多文档界面 基于对话框的应用程序 使用AppWizard创建 创建 使用 SDI和MDI界面的应 和 界面的应 用程序的过程几乎完 全一样 主 要 差 别 MDI的应用程序每次 的应用程序每次 可以读写多个文件或 文档, 文档,可同时对多个 文档进行操作, 文档进行操作,可以 有多个子窗口
刷新视图时默认的函数调用过程:
CDocument::UpdateAllViews() ---CView::OnUpdate() ---CWnd::Invalidate() ---OnPaint() ---OnDraw()
2.3 CView类 类
视图类(CView)是从CWnd类下派生的
视图类具有CWnd的所有功能 如:创建、移动、显示和隐 藏窗口等。CView类可以接 收任何Windows消息,而 CDocument类则不行 IsSelected():确定文档是否被选中 确定文档是否被选中 CView主要 主要 OnScroll():当用户滚动时,CView的响应 当用户滚动时, 当用户滚动时 的响应 虚拟方法 OnInitialUpdate():在类第一次构造后由 在类第一次构造后由MFC调用 调用 在类第一次构造后由 OnDraw():由MFC调用发出文档到设备描述表 由 调用发出文档到设备描述表 OnUpdate():由MFC调用对文档的修改进行响应 由 调用对文档的修改进行响应 OnPrepareDC():在调用 在调用OnDraw()前允许修改设备描述表由 前允许修改设备描述表由MFC调用 在调用 前允许修改设备描述表由 调用