Visual C++应用教程 教学课件 ppt 作者 郑阿奇 丁有和 第8章视图应用框架

上传人:E**** 文档编号:89399570 上传时间:2019-05-24 格式:PPT 页数:64 大小:768KB
返回 下载 相关 举报
Visual C++应用教程 教学课件 ppt 作者  郑阿奇 丁有和 第8章视图应用框架_第1页
第1页 / 共64页
Visual C++应用教程 教学课件 ppt 作者  郑阿奇 丁有和 第8章视图应用框架_第2页
第2页 / 共64页
Visual C++应用教程 教学课件 ppt 作者  郑阿奇 丁有和 第8章视图应用框架_第3页
第3页 / 共64页
Visual C++应用教程 教学课件 ppt 作者  郑阿奇 丁有和 第8章视图应用框架_第4页
第4页 / 共64页
Visual C++应用教程 教学课件 ppt 作者  郑阿奇 丁有和 第8章视图应用框架_第5页
第5页 / 共64页
点击查看更多>>
资源描述

《Visual C++应用教程 教学课件 ppt 作者 郑阿奇 丁有和 第8章视图应用框架》由会员分享,可在线阅读,更多相关《Visual C++应用教程 教学课件 ppt 作者 郑阿奇 丁有和 第8章视图应用框架(64页珍藏版)》请在金锄头文库上搜索。

1、第8章视图应用框架,8.1文档与视图的相互作用,8.2一般视图框架,8.3列表视图框架,8.4树视图框架,8.5切分视图框架,8.6综合应用,8.1文档与视图的相互作用,1. CView:GetDocument函数 视图对象只有一个与之相联系的文档对象,它所包含的GetDocument函数允许应用程序由视图得到与之相联系的文档。假设视图对象接收到了一条消息,表示用户输入了新的数据,此时,视图就必须通知文档对象对其内部数据进行相应的更新。GetDocument函数返回的是指向文档的指针,利用它用户就可以对文档类成员函数及公共数据成员进行访问。 当MFC AppWizard产生应用程序CView类

2、时,它同时也创建一个安全类型的GetDocument函数,它返回的是指向用户派生文档类的指针。该函数是一个内联(inline)函数,如下面的代码: CEx_SDIDoc* CEx_SDIView:GetDocument() / non-debug version is inline ASSERT(m_pDocument-IsKindOf(RUNTIME_CLASS(CEx_SDIDoc); / “断言”m_pDocument指针所指向的CEx_SDIDoc类是一个RUNTIME_CLASS类型 return (CEx_SDIDoc*)m_pDocument; ,8.1文档与视图的相互作用,2.

3、 CDocument:UpdateAllViews函数 如果文档中的数据发生了改变,那么与文档相关联的所有的视图都必须被通知到,以便它们能够对所显示的数据进行相应的更新。UpdateAllViews函数就起到这样的作用,它的原型如下。 void UpdateAllViews( CView* pSender, LPARAM lHint = 0L, CObject* pHint = NULL ); 其中,参数pSender表示视图指针,若在应用程序文档类的成员函数中调用该函数,则此参数应为NULL,若该函数被应用程序视图类中的成员函数调用,则此参数应为this。lHint通常表示更新视图时发送信息

4、的提示标识值,pHint表示存贮信息的对象指针。 当UpdateAllViews函数被调用时,如果参数pSender指向某个特定的视图对象,那么除了该指定的视图之外,文档的所有其他视图的OnUpdate函数都会被调用。 CView:OnUpdate函数 这是一个虚函数。当应用程序调用了CDocument:UpdateAllViews函数时,视图应用框架就会相应地调用该函数。 virtual void OnUpdate( CView* pSender, LPARAM lHint, CObject* pHint );,8.1文档与视图的相互作用,其中,参数pSender表示文档被更改的所在视图类指

5、针,当为NULL时表示所有的视图需要更新。 默认的OnUpdate函数(lHint = 0, pHint = NULL)使得整个窗口矩形无效。如果用户想要视图的某部分无效,那么用户就要定义相关的提示(Hint)参数给出准确的无效区域;lHint和pHint含义同UpdateAllViews。 事实上,hint机制主要用来在视图中根据提示标识值来获取文档或其他视图传递来的数据,例如将文档的CPoint数据传给所有的视图类,则有下列语句: GetDocument()-UpdateAllViews(NULL, 1, (CObject *) 4. CView:OnInitialUpdate函数 当应用

6、程序被启动时,或当用户从“文件”菜单中选择了“新建”或“打开”时,该CView虚函数都会被自动调用。该函数除了调用无提示参数(lHint = 0, pHint = NULL)的OnUpdate函数之外,没做其他任何事情。 但用户可以在视图类中重载此函数,然后对文档所需信息进行初始化操作。例如,如果用户应用程序中的文档大小是固定的,那么用户就可以在此重载函数中根据文档大小设置视图滚动范围;如果应用程序中的文档大小是动态的,那么用户就可在文档每次改变时调用OnUpdate来更新视图的滚动范围。,8.1文档与视图的相互作用,5. CDocument:OnNewDocument函数 在文档应用程序中,

7、当用户从“文件”菜单中选择“新建”命令时,框架将首先构造一个文档对象,然后调用该虚函数,这里是设置文档数据成员初始值的好地方。当然,文档数据成员初始化处理还有其他的一些方法。例如,对于文档应用程序来说,用户还可在文档构造函数中添加初始化代码。 MFC AppWizard为用户的派生文档类自动产生了重载的OnNewDocument函数,如下面的代码: BOOL CMyDoc:OnNewDocument() if (!CDocument:OnNewDocument() /注意一定要保证对基类函数的调用, return FALSE; / Do initialization of new docume

8、nt here. return TRUE; ,8.2一般视图框架,MFC中的CView类及其它的派生类封装了视图的各种不同的应用功能,它们为用户实现最新的Windows应用程序特性提供了很大的便利。这些视图类如表8.1所示。它们都可以作为文档应用程序中视图类的基类,其设置的方法是在MFC AppWizard(.exe)创建SDI/MDI的第6步中进行用户视图类的基类的选择。,表8.1 CView的派生类及其功能描述,8.2一般视图框架,8.2.1 CEditView和CRichEditView 下面来看使用CEditView视图应用框架实例,使其能像记事本那样自动进行文档的显示、修改、打开和保

9、存等操作。 例Ex_Edit 创建CEditView视图应用程序 (1)选择“文件”“新建”菜单,在弹出的“新建”对话框中选择“工程”标签,选择MFC AppWizard(exe)的项目类型,指定项目工作文件夹位置,输入项目名Ex_Edit,单击确定按钮。 (2)在向导的第一步中,将应用程序类型选为“单文档”(SDI)。 (3)保留默认选项,单击下一步按钮,直到出现向导的第六步,将CEx_EditView的基类选为CEditView,如图8.1所示。,图8.1 更改CEx_EditView的基类,8.2一般视图框架,(4)单击完成按钮,编译运行,打开一个文档,结果如图8.2所示。,图8.2 E

10、x_Edit运行结果,需要说明的是,尽管CEditView类具有编辑框控件的功能,但它却不具有所见即所得编辑功能,而且只能将文本作单一字体的显示,不支持特殊格式的字符。,8.2一般视图框架,8.2.2 CFormView CFormView是一个非常有用的视图应用框架,它具有许多无模式对话框的特点。像 CDialog的派生类一样,CFormView的派生类也和相应的对话框资源相联系,它也支持对话框数据交换和数据校验(DDX和DDV)。CFormView还是所有表单视图类(如CRecordView、CDaoRecordView、CHtmlView等)的基类。 下面来看一个示例,它在一个单文档应用

11、程序Ex_Form中添加表单后,将文档内容显示在表单视图的编辑框控件中。 例Ex_Form 添加表单视图应用框架 用MFC AppWizard创建一个默认的的单文档应用程序Ex_Form。 将项目工作区切换到ClassView页面,在顶层项名称上右击鼠标按钮。从弹出的快捷菜单中选择“New Form”命令,或者直接在主菜单中选择“插入”“窗体”菜单命令,弹出 “新建窗体”(New Form)对话框,在名称(Name)框中输入CTextView,结果如图8.3所示。,8.2一般视图框架,图8.3 “新建窗体”对话框,8.2一般视图框架,(3)单击确定按钮,这样,一个表单视图派生类的程序框架就被添

12、加到用户程序中。此时的界面如图8.4所示。右边是表单资源编辑器,它与对话框编辑器是一样的。,表单模板,图8.4 添加表单后的开发环境,8.2一般视图框架,(4)右击表单模板,从弹出的快捷菜单中选择“属性”命令,在表单属性对话框将其字体设置为“宋体,9号”。 (5)删除原来的静态文本控件,添加一个编辑框(用于文档内容的显示),在其“样式”属性对话框中,选中“多行”(Multiline)、“水平滚动条”(Horizontal scroll)、“垂直滚动条”(Vertical scroll)和“自动垂直滚动”(Auto VScroll)属性。保留默认编辑框的标识不变(IDC_EDIT1)。 (6)用

13、MFC ClassWizard为IDC_EDIT1创建一个CString控件变量m_strText。 (7)为CEx_FormDoc类添加一个成员变量CString m_strContent。 (8)在CEx_FormDoc:Serialize函数中添加下列代码: void CEx_FormDoc:Serialize(CArchive/ 在每行文本未尾添加回车换行 ,8.2一般视图框架,(9)用MFC ClassWizard为CTextView类添加OnUpdate函数的重载映射,当文档更新后,会自动通知其关联的视图类,并自动调用OnUpdate函数。在OnUpdate函数中添加下列代码: v

14、oid CTextView:OnUpdate(CView* pSender, LPARAM lHint, CObject* pHint) CEx_FormDoc* pDoc = (CEx_FormDoc*)GetDocument(); m_strText = pDoc-m_strContent; UpdateData(FALSE); (10)在TextView.cpp文件前面添加CEx_FormDoc类头文件包含: #include “Ex_Form.h“ #include “TextView.h“ #include “Ex_FormDoc.h“,8.2一般视图框架,(11)由于表单添加后,M

15、FC会自动在CEx_FormApp:InitInstance函数中添加一个单文档模板代码,这样该单文档应用程序就有两个文档类型。事实上,在本例中只需要一个文档模板类型,故将InitInstance函数修改如下: BOOL CEx_FormApp:InitInstance() / BLOCK: doc template registration / Register the document template. Document templates serve / as the connection between documents, frame windows and views. / At

16、tach this form to another document or frame window by changing AddDocTemplate(pNewDocTemplate); / 前面的这段文档模板代码删除 AfxEnableControlContainer(); pDocTemplate = new CSingleDocTemplate( IDR_MAINFRAME, RUNTIME_CLASS(CEx_FormDoc), RUNTIME_CLASS(CMainFrame), / main SDI frame window RUNTIME_CLASS(CTextView); / 修改成添加的表单视图类 AddDocTemplate(pDocTemplate); return TRUE; ,8.2一般视图框架,(12)编译运行并测试,结果如图8.5所示。,图8.5 Ex_Form第一次运行结果,8

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 高等教育 > 大学课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号