第2章C面向对象编程课件.ppt

上传人:牧羊曲112 文档编号:3730482 上传时间:2023-03-18 格式:PPT 页数:62 大小:592KB
返回 下载 相关 举报
第2章C面向对象编程课件.ppt_第1页
第1页 / 共62页
第2章C面向对象编程课件.ppt_第2页
第2页 / 共62页
第2章C面向对象编程课件.ppt_第3页
第3页 / 共62页
第2章C面向对象编程课件.ppt_第4页
第4页 / 共62页
第2章C面向对象编程课件.ppt_第5页
第5页 / 共62页
点击查看更多>>
资源描述

《第2章C面向对象编程课件.ppt》由会员分享,可在线阅读,更多相关《第2章C面向对象编程课件.ppt(62页珍藏版)》请在三一办公上搜索。

1、第 5 章 文档与视图,文档与视图结构的工作原理文档的读写操作机制菜单编程工具栏编程状态栏编程,文档与视图结构是MFC应用程序最基本的程序结构,适用于大多数Windows应用程序。文档和视图完成了程序的大部分功能,它们是MFC应用程序的核心。文档与视图结构是MFC的基石,掌握文档与视图结构对于利用MFC编程有着至关重要的意义。本章对文档与视图结构进行更深入的讨论。,信息管理是计算机的一个主要应用,而信息是用数据表示的,因此数据的处理是一般软件都要完成的一项主要工作。采用传统的编程方法,数据处理是一项复杂的任务,并且每一个程序员都可能有不同的处理方法。为了统一和简化数据处理方法,Microsof

2、t公司在MFC中提出了文档/视图结构的概念,其产品Word就是典型的文档/视图结构应用程序。,5.1 文档与视图结构,标题栏主菜单工具栏客户区状态栏不同程序的相同菜单项和工具栏按钮表示相同的操作。,5.1.1 文档与视图结构概述,Windows应用程序界面特点:,分为数据的管理和显示 文档用于管理和维护数据 视图用来显示和编辑数据 MFC通过其文档类和视图类提供了大量有关数据处理的方法。,MFC文档/视图结构数据处理工作分工:,文档的概念在MFC应用程序中的适用范围很广,一般说来,文档是能够被逻辑地组合的一系列数据,包括文本、图形、图象和表格数据。一个文档代表了用户存储或打开的一个文件单位。文

3、档的主要作用是把对数据的处理从对用户界面的处理中分离出来,集中处理数据,同时提供了一个与其它类交互的接口。,什么是文档?,视图是文档在屏幕上的一个映像,它就像一个观景器,用户通过视图看到文档,也是通过视图来改变文档,视图充当了文档与用户之间的媒介物。应用程序通过视图向用户显示文档中的数据,并把用户的输入解释为对文档的操作。一个视图总是与一个文档对象相关联,用户通过与文档相关联的视图与文档进行交互。当用户打开一个文档时,应用程序就会创建一个与之相关联的视图。,什么是视图?,视图负责显示和编辑文档数据,但不负责存储。用户对数据的编辑需要依靠窗口上的鼠标与键盘操作才得以完成,这些消息都是由视图类接收

4、后进行处理或通知文档类,如收到窗口刷新消息时调用视图类的成员函数OnDraw()显示文档内容。视图还可在打印机上输出。文档负责数据的读写操作,数据通常被保存在文档类的成员变量中,文档类通过一个称为序列化的成员函数将成员变量的数据保存到磁盘文件中。MFC应用程序为数据的序列化提供了默认支持。,视图和文档的功能:,文档、视图、框架窗口之间的关系,一个视图是一个没有边框的窗口,它位于主框架窗口中的客户区。视图是文档对外显示的窗口,但它并不能完全独立,它必须依存在一个框架窗口内。一个视图只能拥有一个文档,但一个文档可以同时拥有多个视图。,视图是文档在屏幕上的一个映像,它就像一个观景器,文档/视图结构的

5、优点:,把数据处理类从用户界面处理类中分离出来,使得每一个类都能集中地执行一项工作。把Windows程序通常要做的工作分成若干定义好的类,这样有助于应用程序的模块化,程序也易于扩展,编程时只需修改所涉及的类。虽然文档/视图结构牵涉到许多类,其中的也关系比较复杂,但MFC AppWizard向导建立的MFC应用程序框架已经把程序的主要结构完成了,模块间的消息传递以及各函数的功能都已确定。MFC应用程序框架起到了穿针引线的作用,按照消息处理函数功能的不同,将不同消息的响应分别分布在文档类和视图类中。,文档/视图结构并没有完全要求所有数据都属于文档类,视图类也可以有自己的数据。如果在视图类中不定义任

6、何数据,在需要时都从文档类中获取,这样做会影响程序的效率。例如,在文本编辑程序中,往往在视图中缓存部分数据,这样可以避免对文档的频繁访问,提高运行效率。,在视图类中定义数据,包含多个类的MFC文档/视图结构应用程序要管理这些类中的数据,除了考虑在程序的哪一部分拥有数据和在哪一部分显示数据,一个主要的问题是文档数据更改后如何保持视图显示的同步,即文档与视图如何进行交互。在文档、视图和应用程序框架之间包含了一系列复杂的相互作用过程,文档与视图的交互是通过类的公有成员变量和成员函数实现的。,5.1.2 文档与视图之间的相互作用,1视图类的成员函数GetDocument()一个视图对象只有一个与之相关

7、联的文档对象。在MFC应用程序中,视图对象通过调用成员函数函数GetDocument()得到当前文档。GetDocument()是视图类的成员函数,调用它可以返回与视图相关联的文档对象的指针,利用这个指针可以访问文档类及其派生类的公有成员。当利用MFC AppWizard向导创建一个SDI单文档应用程序Mysdi时,生成了视图类的一个派生类,并在派生类中定义了函数GetDocument()。,文档和视图类常用的成员函数,一个文档对象可以有多个与之相关联的视图对象,当一个文档的数据通过某个视图被修改后,与它关联的每一个视图都必须反映出这些修改。因此,视图在需要时必须进行重绘,即当文档数据发生改变

8、时,必须通知到所有相关联的视图对象,以便更新所显示的数据。更新与该文档有关的所有视图的方法是调用成员函数CDocument:UpdateAllViews()。,2CDocument类的成员函数UpdateAllViews(),5.2.2 添加菜单命令处理函数,菜单实际上是一系列命令的列表,当一个菜单项被选中后,一个含有该菜单项ID标识的WM_COMMAND命令消息将发送到应用程序窗口,应用程序将该消息转换为一个函数(命令消息处理函数)调用。命令消息来自于用户界面对象,是由菜单项、工具栏按钮和快捷键等程序界面元素发送的WM_COMMAND消息。在MFC应用程序中,许多类都能接收菜单被选中而引发的

9、消息。总的来说,从类CCmdTarget派生出来的类都可以加入应用程序的消息循环。,应该将菜单命令映射到哪个类中,需要由该命令的功能决定。如果一个命令同视图的显示有关,就应该将其映射到视图类;如果同文档的读写有关,就映射到文档类中;如果命令完成通用功能,一般映射到窗口框架类。有时无法对功能进行准确分类,则可以将菜单命令映射到任意一个类,看看是否能够完成指定的功能。,将菜单命令映射到哪个类?,Windows是基于事件驱动、消息传递的操作系统。用户所有的输入都是以事件或消息的形式传递给应用程序的,鼠标也不例外。鼠标驱动程序将鼠标硬件信号转换成Windows可以识别的信息,Windows根据这些信息

10、构造鼠标消息,并将它们发送到应用程序的消息队列中。,5.3 鼠标消息处理,鼠标构成:左键、右键(中键和滚动滑轮)鼠标操作:单击、双击、释放和移动 主要鼠标消息:WM_MOUSEMOVE:移动 WM_LBUTTONDOWN:按下左键 WM_LBUTTONUP:释放左键 WM_RBUTTONDOWN:按下右键 WM_RBUTTONUP:释放右键 WM_LBUTTONDBLCLK:双击左键,5.3.1 鼠标消息,鼠标消息分为两类:,客户区鼠标消息 非客户区鼠标消息:,WM_NCLBUTTONDOWN:按下鼠标左键消 WM_NCRBUTTONDOWN:按下鼠标右键.,非客户区鼠标消息由Windows操

11、作系统处理,应用程序一般不需要处理。客户区鼠标消息发送到应用程序后,可以由应用程序自己处理。通过消息结构中的消息参数wParam来区分客户区鼠标消息和非客户区鼠标消息。,利用MFC ClassWizard类向导生成的鼠标消息处理函数一般都有两个参数:nFlags:类型为UINT,表示鼠标按键和 键盘上控制键的状态。point:类型为CPoint,表示鼠标当前所 在位置坐标。,鼠标消息处理函数参数,计算机可视化编程,第 二十九 讲,主讲教师:隋振学时:32,基于Visual C+6.0的面向对象编程,使用鼠标的一个典型例子就是绘图程序,鼠标被用作画笔,绘图过程中要进行不同鼠标消息的处理,如按下鼠

12、标、释放鼠标和移动鼠标等。当用户按下鼠标左键时必须记录下当前鼠标的位置,当用户移动鼠标时,如果鼠标左键被按住,则从上一个鼠标位置到当前位置画一段直线,并保存当前鼠标的位置,供下一次画线用。当用户弹起鼠标左键时释放鼠标。,5.3.1 鼠标消息处理举例:绘图程序,例 编写一个绘图程序,程序运行后,当用户在客户区窗口按下鼠标左键并移动时,根据鼠标移动的轨迹绘制出指定的线段。类似于画图软件,1、设计CLine类2、在文档中添加Cline数组和表示线数量的变量3、在构造函数中初始化4、在视类中添加Cline型变量,保存当前线5、添加变量BOOL型,记录左键是否按下6、添加鼠标的函数,计算机可视化编程,第

13、 三十 讲,主讲教师:隋振学时:32,基于Visual C+6.0的面向对象编程,OnLButtonDown,记线起点,和鼠标按下标记OnMouseMove,先擦原线,再画新线OnLButtonUp,记录新线到文档中7、OnDraw()8、文档中保存,计算机可视化编程,第 三十一 讲,主讲教师:隋振学时:32,基于Visual C+6.0的面向对象编程,void CMyDrawView:OnLButtonDown(UINT nFlags,CPoint point)/TODO:Add your message handler code here and/or call defaultm_bIsM

14、ouseDown=TRUE;/设置拖拽标记SetCapture();/捕捉鼠标:SetCursor(m_hCross);/设置十字光标m_Line.m_nX1=point.x;/设置新值m_Line.m_nY1=point.y;m_Line.m_nX2=point.x;/起点终点设置成同一个点m_Line.m_nY2=point.y;/相当于线长度是零CView:OnLButtonDown(nFlags,point);,void CMyDrawView:OnMouseMove(UINT nFlags,CPoint point)/TODO:Add your message handler cod

15、e here and/or call defaultif(m_bIsMouseDown)CClientDC ClientDC(this);ClientDC.SetROP2(R2_NOT);/按取反方式画图m_Line.Draw(,void CMyDrawView:OnLButtonUp(UINT nFlags,CPoint point)/TODO:Add your message handler code here and/or call defaultif(m_bIsMouseDown)m_bIsMouseDown=FALSE;ReleaseCapture();/释放鼠标,还原鼠标形状m_L

16、ine.m_nX2=point.x;/设置终点m_Line.m_nY2=point.y;CMyDrawDoc*pDoc=GetDocument();/取文档指针ASSERT_VALID(pDoc);pDoc-m_LinepDoc-m_nLineCounter=m_Line;/保存pDoc-m_nLineCounter+;Invalidate(NULL);/重画CView:OnLButtonUp(nFlags,point);,1利用MFC AppWizardexe向导创建一个SDI应用程序MyDraw,为视图类CMyDrawView添加成员变量:protected:/定义有关鼠标作图的成员变量C

17、line m_Line;/保存当前线段bool m_bDragging;/拖拽标记HCURSOR m_hCross;/光标句柄,2在视图类CMyDrawView构造函数中设置拖拽标记和十字光标。CMyDrawView:CMyDrawView()/TODO:add construction code herem_bDragging=false;/初始化拖拽标记/获得十字光标句柄m_hCross=AfxGetApp()-LoadStandardCursor(IDC_CROSS);,3利用ClassWizard类向导为视图类添加按下鼠标左键WM_LBUTTONDOWN的消息处理函数。,void CM

18、yDrawView:OnLButtonDown(UINT nFlags,CPoint point)/TODO:Add your message.SetCapture();/捕捉鼠标:SetCursor(m_hCross);/设置十字光标/CView:OnLButtonDown(nFlags,point);,2为类CLine定义成员变量和成员函数。class Cline:CObjectprivate:/定义成员变量,表示一条直线起点和终点的坐标int m_X1;int m_Y1;int m_X2;int m_Y2;public:CLine();virtual CLine();CLine(CPoi

19、nt pt1,CPoint pt2);/构造函数void DrawLine(CDC*pDC);/绘制线段;,CLine:CLine(CPoint pt1,CPoint pt2)m_X1=pt1.x;m_Y1=pt1.y;m_X2=pt2.x;m_Y2=pt2.y;void CLine:DrawLine(CDC*pDC)pDC-MoveTo(m_X1,m_Y1);pDC-LineTo(m_X2,m_Y2);,在Line.cpp中编写成员函数的实现代码:,为了在改变程序窗口大小或最小化窗口后重新打开窗口时保留窗口中原有的图形,必须在OnDraw()函数中重新绘制前面利用鼠标所绘制的线段。这些线段的

20、坐标作为类CLine对象的成员变量,所有CLine对象的指针已保存在动态数组m_LineArray中。,5.修改OnDraw()函数,void CMyDrawView:OnDraw(CDC*pDC)CMyDrawDoc*pDoc=GetDocument();ASSERT_VALID(pDoc);/TODO:add draw code for native data hereint nIndex=pDoc-GetNumLines();/取得线段的数量/循环画出每一段线段while(nIndex-)/数组下标从0到nIndex-1pDoc-GetLine(nIndex)-DrawLine(pDC)

21、;/类CLine的成员函数,计算机可视化编程,第 三十二 讲,主讲教师:隋振学时:32,基于Visual C+6.0的面向对象编程,6.光标使用,m_hCross=AfxGetApp()-LoadStandardCursor(IDC_CROSS);:SetCursor(m_hCross);/设置十字光标m_hCross=AfxGetApp()-LoadCursor(IDC_HAND);:SetCursor(m_hCross);,涉及到数据处理的应用程序一般都要考虑文档数据的永久保存。虽然我们可以直接利用类CFile来实现文件的读写操功能,但在MFC应用程序中,序列化(Serialize)使得程

22、序员可以不直接面对一个物理文件而进行文档的读写。序列化实现了文档数据的保存和装入的幕后工作,MFC通过序列化实现应用程序的文档读写功能。,5.5 文档的读写,一个可序列化的类必须有一个称作为序列化的成员函数Serialize(),文档的序列化在文档类的成员函数Serialize()中进行。MFC AppWizard应用程序向导在生成应用程序时只创建了文档派生类序列化Serialize()函数的框架,由于不同程序的数据结构各不相同,可序列化的类应该重载Serialize()函数,使其支持对特定数据的序列化。并且,任何需要保存的变量(数据)都应该在文档派生类中声明。,序列化函数Serialize(

23、),void CMyDoc:Serialize(CArchive&ar)if(ar.IsStoring()/TODO:add storing code here.else/TODO:add loading code here.,3.MFC AppWizard向导生成的Seralize()函数,函数参数ar是一个CArchive类的对象,文档数据的序列化操作通过CArchive类对象作为中介来完成。CArchive类对象由应用程序框架创建,并与用户正在使用的文件关联在一起。CArchive类包含一个类CFile指针的成员变量,当创建一个CArchive类对象时,该对象与一个类CFile或其派生类

24、的对象联系在一起,代表一个已打开的文件。C+主要通过文件句柄来实现磁盘输入和输出,一个文件句柄与一个磁盘文件相关联。而MFC中物理文件的读写操作是由CFile类及其派生类来完成的,它们对文件句柄进行了封装。CArchive类对象为读写CFile类对象中的可序列化数据提供了一种安全的缓冲机制,它们之间形成了如下关系:Serialize()函数 CArchive类对象CFile类对象 磁盘文件,void CLine:Serialize(CArchive/读出对象的数据,4现在我们实现了CLine类的序列化,但只是一条线段的序列化。前面定义了CObArray类型的变量m_LineArray,由于CO

25、bArray类自身提供了序列化函数,所以作为CObArray类的对象m_LineArray可以直接序列化。变量m_LineArray中存放的是CLine类对象的指针,自然会调用类CLine的序列化函数,完成了多个CLine类对象的序列化。,void CMyDrawDoc:Serialize(CArchive,MFC为应用程序提供了多种不同的视图,除了我们平常使用最多的一般视图CView,我们还可以使用其它视图,如滚动视图CScrollView、文本编辑视图CEditView、对话框视图CFormView、列表视图CListView和树型视图CTreeView等,这些视图都是从类CView派生而

26、来。在利用应用程序向导创建一个文档/视图结构的应用程序时,在向导的第6步我们可以为应用程序选择不同的视图。,5.6 使用不同视图,1.滚动视图类CScrollView 为了实现滚动视图的,MFC提供了滚动视图类CScrollView。在使用类CScrollView时,一般情况下,我们使用默认的滚动值,且不需要程序员自己处理滚动消息。编程时可使用CScrollView类的一些常用成员函数:SetScrollSizes():用于设置整个滚动视图的大小、每一页和每一行的大小;GetTotalSize():用于获取滚动视图的大小;GetScrollPosition():用于获取当前可见视图左上 角的坐

27、标。,5.6.1 滚动视图,利用向导创建程序时采用CScrollView作为基类如果为用类CView作为基类的程序增加滚动功能,可直接在原来的程序基础上作相应修改:(1)手工将视图类CView改为CScrollView。(2)重载视图类虚函数OnInitialUpdate()或WM_CREATE的消息处理函数OnCreate(),根据文档大小设置滚动视图。(3)注意设备坐标与逻辑坐标的转换。如在鼠标消息处理函数中使用CClientDC客户设备环境,其坐标是客户区坐标,而在OnDraw()函数中使用的坐标是逻辑坐标。参见例5-13。,2.滚动视图程序的2种设计方法:,5.6.2 多视图,文档与视

28、图分离使得一个文档对象可以和多个视图相关联,这样可更容易实现多视图应用程序。一般多视图应用程序都是MDI程序,但SDI程序也可以实现多视图。对于单文档应用程序一般采用拆分窗口的方式实现多视图。除了采用拆分窗口实现多视图,还可以利用子框架窗口实现多视图,例5-14就是采用这种方式实现多视图。视图总是通过文档模板与一个框架窗口和一个文档相关联,文档模板对象是在应用程序的初始化函数InitInstance()中创建的。在利用向导创建一个MDI应用程序后,程序自动具有多视图的功能。,利用类向导建立新的视图类;在函数InitInstance()中构建一个与新的视图类相关联的文档模板对象,但暂时不要加入它

29、;在函数ExitInstance()中删除构建的文档模板对象;在相关菜单的命令处理函数中调用函数CDocTemplate:CreateNewFrame()为构键的文档模板创建新的框架窗口,调用函数CDocTemplate:InitialUpdateFrame()更新视图。,MFC实现多视图的基本方法和步骤:,5.7菜单 工具栏 状态栏,1 添加菜单项2 添加菜单子项3 设置ID和标题4 添加响应函数5 在工具栏中添加新图标6 设置与菜单相同的ID7 写状态栏提示及弹出提示,5.8 软件图标,软件图标1 大图标:资源管理器中,图标方式时显示2 小图标:列表方式时显示关联文件图标3 大文件图标4

30、小文件图标,在Windows中,每个文件都有一个图标(Icon)。应用程序图标通常会出现在程序标题栏的左上角、Windows底部的任务栏、资源管理器窗口和Windows桌面上。图标实质上是特殊形式的位图,但图标与位图有两个不同之处。首先,图标大小尺寸只能有三种,一种是用于标题栏和最小化时的1616图标,另外两种是用于桌面、资源管理器的3232和4848图标。其次,设计图标时可以指定像素的颜色为屏幕颜色或屏幕反转色,如图所示。这样,Windows在显示图标时,采用屏幕颜色的像素位置颜色不变,该位置图标部分看起来是透明的,而屏幕反转色部分在任何彩色背景下都能显示。,学习要点,基本要素:标识符、关键

31、字、常量、变量、运算符和表达式等运算符和表达式基本数据类型指针类型和构造类型(包括数组、指针、字符串、结构和枚举等类型),三种流程控制结构:顺序结构分支结构循环结构。,函数定义、函数调用和函数声明什么是对象对象=数据+作用于这些数据上的操作什么是类类的定义与实现什么是构造函数什么是析构函数类的继承MFC是一个编程框架 编程规范匈牙利表示法则,Visual C+的安装集成开发环境窗口MFC AppWizardexe创建应用程序的类型:Single document:单文档界面应用程序Multiple documents:多文档界面应用程序Dialog based:基于对话框的应用程序,对话框是W

32、indows应用程序中一种常用的资源,其主要功能是输出信息和接收用户的输入数据。控件是嵌入在对话框中或其它父窗口中的一个特殊的小窗口,它用于完成不同的输入、输出功能。对话框与控件关系密切,在每个对话框上一般都有一些控件,对话框依靠这些控件与用户进行信息的交互。本章主要介绍对话框的工作原理和编程方法,并通过实例学习一些标准控件和公共控件的使用方法。,Windows提供的控件分为两类:标准控件和公共控件。标准控件:静态控件、编辑框、按钮、列表框、组合框和滚动条等。利用标准控件可满足大部分用户界面程序设计的要求。公共控件:滑块、进度条、列表视控件、树视控件和标签控件等,利用公共控件实现应用程序用户界

33、面风格的多样性。,UpdateData()的用法定时器1)SetTimer(int,int,callback functiom)参数1,定时器号 参数2,定时间隔,单位mS 参数3,回调函数,通常NULL(2)通过向导添加OnTimer函数(3)编辑函数OnTimer()(4)KillTimer()关闭定时器,子对话框使用:CMyDialog myDlg;myDlg.DoModal();MFC公用对话框类 CColorDialog CFileDialog FindReplaceDialog CFontDialog PagesSetupDialog CPrintDialog COleDialog,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号