vc6s-chap04-文档与视图结构
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
(4) 成员函数 OnInitialUpdate
原型为:virtual void OnInitialUpdate( );
通过重载OnInitialUpdate函数可以完成视图类的初 始化。应用程序框架在创建视图时,首先调用OnCreate 函数,然后调用OnInitialUpdate函数。
4.2.3 CMyPainterView类文件代码
4.1.2 文档类(CDocument类)中的 主要数据成员和成员函数
(1)文档类的数据成员 文档数据必须用文档类的数据成员来实现。在定
义文档数据成员时,为了设置和获取数据项,通常把成 员函数添加到文档类中,并在成员函数上执行其他有用 操作。
视图通过指向文档的指针来访问文档对象,可以 通过调用CView::GetDocument来获取指
// TODO: add storing code here } else {
// TODO: add loading code here } }
(8) 成员函数 UpdateAllViews
原型为:void UpdateAllViews( CView* pSender, LPARAM lHint = 0L, CObject* pHint = NULL );
CRecordView
在控件中显示数据库表中字段的表单视图
CDaoRecordVie w CCtrlView
在控件中显示数据库表中字段的表单视图 控件视图类
CEditView CRichEditView CListView CTreeView
CctrlView的派生类,封装了编辑控件的功能,提供了一个简单的文 本编辑器的视图类 CctrlView的派生类,封装了RichEdit控件,支持多种字体、颜色、 OLE的高级编辑器的视图类
CctrlView的派生类,封装了列表控件的功能,管理项目列表的视图 类 CctrlView的派生类,封装了树形控件功能的视图类
4.3 窗口框架类
MFC使用窗口框架类管理框架,使用视图类管 理框架中的视图。用户与文档之间的交互操作发 生在视图的客户区内,而不是框架窗口的客户区 内。框架窗口提供了环绕视图的可见框架,其中 包括菜单、最小化和最大化窗口按钮等。
该函数返回指向与视图相联的文档对象指针,如 果没有文档与视图相联,则返回NULL。调用该函数 以获得一个指向当前视图所对应的文档类指针,利用 它能够对文档类的成员函数和公共数据成员进行访问。
(3) 成员函数 OnUpdate
原型为:virtual void OnUpdate( CView* pSender, LPARAM lHint, CObject* pHint );
(3)单个边框窗口中有不同类的视图对象,多个视图 共享单个边框窗口,每个视图从不同类构造。例如,可 以在一个视图显示文本文档,而在另一视图显示图形文 档。
4.2.5派生的视图类
派生视类
说明
CScrollView
为视图提供滚动和缩放显示功能
CFormView
提供可滚动的视图来显示由对话框控件组成的表单
4.2.2 视类(CView类)中的主要数据成员 和成员函数
(1) 成员函数Байду номын сангаасOnDraw
原型为:virtual void OnDraw( CDC* pDC ) = 0;
应用程序几乎所有的绘制工作都是在OnDraw成 员函数中实现的,编程时必须在视图类中重载此函数。
void CMyPainterView::OnDraw(CDC* pDC) {
文档用以保存应用程序的数据,并提供与磁 盘文件的交互以及与视的交互等。
视图以可见的图形方式显示文档数据、提供 用户界面、接受用户操作信息,并将视图相关的 操作传递到文档,以及接受文档的更新视操作等。
磁盘
文档
视图
用户
CObject (根类) CCmdTarget(应用程序结构类) CDocument(文档类) 用户文档
UpdateAllViews(NULL);
如果在派生视图类的成员函数中调用 UpdateAllVies函数,调用形式为:
GetDocument()->UpdateAllViews(this);
4.1.3 CMyPainterDoc类文件代码
4.1.4 多文档类型 AppWizard创建的应用程序框架开始只支持单个 文档类。如果应用程序要支持多文档类型,那么必须 创建新的文档类。每种文档类型都有自己的文档类和 视图类。当用户选择“文件”菜单的“新建”命令时 ,应用程序将显示对话框,列出所支持的文档类型, 然后再按用户选择的类型创建文档。每种文档类型都 由自己的文档摸板对象管理。
4.1 文档 4.2 视图 4.3 窗口框架类 4.4 文档模板类 4.5 文档/视图结构各对象之间的关系 4.6 文档/视图结构例题
例题
Ex04_1单文档 Ex04_2多文档 Ex04_3多视图
4.1 文档
4.1.1 4.1.2
4.1.3 4.1.4
使用文档管理数据的一般步骤 文档类(CDocument类)中的主要数据 成员和成员函数 CMyPainterDoc类文件代码 多文档类型
每个应用程序都有一个主边框窗口,主边框 窗口标题栏中显示有应用程序的名称。每个文档都 有一个文档边框窗口。
对 于 每 个 SDI 应 用 程 序 , 都 有 一 个 从 CFrameWnd类派生的边框窗口,该窗口既是主边框 窗口,又是文档边框窗口。
对于,每个MDI应用程序,主边框窗口是从 CMDIFrameWnd类派生的。MDI主边窗口中含有一个 称为MDICLIENT窗口的子窗口,该窗口管理主边框 窗口的客户区并有自己的子窗口(从CMDIChidWnd派 生的文档边框窗口)。因此,在MDI应用程序中,MDI 主边框窗口管理MDICLIENT窗口,MDICLIENT窗口 再管理所有的MDI子窗口。
(3) 成员函数 DeleteContens
原型为: virtual void DeleteContens( );
DeleteContens函数用于在不删除文档对象的情况下 清除文档中的数据。
(4) 成员函数 OnOpenDocument
原型为:virtual BOOL OnOpenDocument(LPCTSTR lpszPathName);
如果所有的视图都要更新,那么参数pSender为 NULL,否则为指向视图的指针;1Hint包含与修改有 关的信息,可以传递任何数据;pHint为指向用于保 存修改信息的对象,可以传递CObject派生的任何对 象的指针。
该函数通知文档对应的所有视图文档已经被更改 了。
如果在派生类文档类的成员函数中调用 UpdateAllViews函数,调用形式为:
调用该成员函数以使视图反应文档数据的变化, 该函数被文档类中的UpdateAllViews函数所调用。不过 用户也可以直接在派生视图类中调用该函数,通常派 生视图类的OnUpdate函数要访问文档,读取文档的数 据,然后再更新视图的数据成员或控件,以便反映出 文档的变化。缺省情况下,OnUpdate使整个视图窗口 无效,同时触发OnDraw函数,使用更新后的文档数据 重新绘制窗口。
CMainFrame类的文件
其中Dump和AssertValid函数只是在应用程序的 调式版中起作用,用户可以重载该函数来诊断程序运 行时出现的问题。在应用程序的发行版中,这些诊断 函数将不被编译。
PreCreatewindow消息处理函数在窗口创建之前 被调用,用于定制窗口风格。
OnCreate消息处理函数在创建框架窗口时被调用 。在该函数中首先执行基类CMDIFrameWnd的成员 函数OnCreate创建框架窗口,然后为该窗口创建工具 栏和状态栏。
当用户选择“文件”菜单的“保存”或者“另存为” 命令时,将调用该函数打开指定文件,并调用Serialize 函数向文件中写入文档数据。
(6) 成员函数 OnCloseDocument
原型为:virtual void OnCloseDocument( );
当一个文档被关闭时,框架就会调用这个函数。函数 的默认操作是关闭所有用于浏览文档的框架窗口和视图, 清除文档的内容,并调用DeleteContents函数删除文档中的 数据。
当用户选择“文件”菜单的“打开”命令时, 将调用OnOpenDocument来打开指定的文件, 并调用DeleteContents来清除文档中的数据, 调用Serialize来从磁盘文件中加载新文档。
(5) 成员函数 OnSaveDocument
原型为:virtual BOOL OnSaveDocument(LPCTSTR lpszPathName);
(7) 成员函数 Serialize
序列化是指将对象写入永久性存储媒体(如磁 盘文件)或从其中读取对象的过程。在文档类中通 常使用Serialize函数完成序列化操作。
void CMyPainterDoc::Serialize(CArchive& ar) {
if (ar.IsStoring()) {
4.1.1 使用文档管理数据的一般步骤
在应用程序中处理文档的一般步骤为: (1)以CDocument类为基类派生出自己的文档类。 (2)在派生的文档类中添加用于保存数据的成员变 量。 (3)编写实现读和修改文档数据的成员函数。 (4)重载文档类的成员函数Serialize,实现将文档 数据写入磁盘和从磁盘读出文档数据的操作。
要创建新的文档类,请打开ClassWizard ,然后用ClassWizard来创建。创建时,请选 择CDocument类作为派生新类的基类,并提供
必要的文档信息,然后再实现这个新类的数据 。接着在应用程序对象的成员函数InitInstance 中增加一次对AddDocTemplate函数的调用。
用户视图类
用户视图类
用户视图类
4.2.1 视操作的一般步骤
视图用于显示文档并管理与用户的交互,视图 的操作步骤一般为:
(1) 以CView类为基类派生出自己的视类。 (2) 通过派生类的OnDraw成员函数向视提供文档 数据。 (3)在派生视类中增加界面设计中涉及的各对象的 Windows消息处理函数。 (4)编写相应的消息处理函数响应用户操作。 (5)根据需要修改该派生视类的其它成员函数。
4.4 文档模板类
为了管理创建文档及其关联的视图和框架窗口 的复杂过程,框架使用了两个文档模板类:
用于单文档应用程序的CSingleDocTemplate 用于多文档应用程序的CMultiDocTemplate 它们都是CDocTemplate的直接派生类。
使用MFC应用程序向导生成InitInstance函数中创建 CMultiDocTemplate的过程。
CMyPainterDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); // TODO: add draw code for native data here }
(2) 成员函数 GetDocument
原型为: CDocument* GetDocument( ) const;
4.2.4 多视图
(1)同一文档的多个视图对象,每个对象置于独立的 MDI子窗口中。例如,选择“窗口”菜单的“新建窗口” 命令打开同一文档的多个MDI子窗口,然后可以在多个 MDI子窗口中同时查看文档的不同部分。
(2)同一文档边框窗口中有同一文档的多个视图对象 。例如,分割窗口可以将单个文档边框窗口的视图空间 分割成多个独立的视图,应用程序从同一视图类中创建 多个视图对象。
4.2 视图
4.2.1 视操作的一般步骤 4.2.2 视类(CView类)中的主要数据成员和 成员函数
4.2.3 CMyPainterView类文件代码 4.2.4 多视图
CObject (根类) CCmdTarget(应用程序结构类) CWnd(窗口类) CView(视图类)
CFormView类 …其它视图类
(2) 成员函数OnNewDocument
原型为:virtual BOOL OnNewDocument( );
当用户选择“文件”菜单的“新建”命令时,将 调用这个函数对文档进行初始化。如果是多文档应用 程序,将创建一个新文档并调用它完成初始化。如果 是单文档应用程序调用这个函数初始化已经存在的文 档。