第2章C面向对象编程课件.ppt
- 【下载声明】
1. 本站全部试题类文档,若标题没写含答案,则无答案;标题注明含答案的文档,主观题也可能无答案。请谨慎下单,一旦售出,不予退换。
2. 本站全部PPT文档均不含视频和音频,PPT中出现的音频或视频标识(或文字)仅表示流程,实际无音频或视频文件。请谨慎下单,一旦售出,不予退换。
3. 本页资料《第2章C面向对象编程课件.ppt》由用户(晟晟文业)主动上传,其收益全归该用户。163文库仅提供信息存储空间,仅对该用户上传内容的表现方式做保护处理,对上传内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(点击联系客服),我们立即给予删除!
4. 请根据预览情况,自愿下载本文。本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
5. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007及以上版本和PDF阅读器,压缩文件请下载最新的WinRAR软件解压。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 面向 对象 编程 课件
- 资源描述:
-
1、 文档与视图结构的工作原理 文档的读写操作机制 菜单编程 工具栏编程 状态栏编程 文档与视图文档与视图结构是MFC应用程序最基本的程序结构,适用于大多数Windows应用程序。文档和视图完成了程序的大部分功能,它们是MFC应用程序的核心。文档与视图结构是MFC的基石,掌握文档与视图结构对于利用MFC编程有着至关重要的意义。本章对文档与视图结构进行更深入的讨论。信息管理是计算机的一个主要应用,而信息是用数据表示的,因此数据的处理是一般软件都要完成的一项主要工作。采用传统的编程方法,数据处理是一项复杂的任务,并且每一个程序员都可能有不同的处理方法。为了统一和简化数据处理方法,Microsoft公司
2、在MFC中提出了文档文档/视图视图结构的概念,其产品Word就是典型的文档/视图结构应用程序。5.1 文档与视图结构文档与视图结构 标题栏 主菜单 工具栏 客户区 状态栏 不同程序的相同菜单项和工具栏按钮表示相同的操作。5.1.1 文档与视图结构文档与视图结构概述概述Windows应用程序界面特点:分为数据的管理和显示 文档文档用于管理和维护数据 视图视图用来显示和编辑数据 MFC通过其文档类和视图类提供了大量有关数据处理的方法。MFC文档文档/视图结构视图结构数据处理数据处理工作分工:工作分工:文档文档的概念在MFC应用程序中的适用范围很广,一般说来,文档文档是能够被逻辑地组合的一系列数据,
3、包括文本、图形、图象和表格数据。一个文档文档代表了用户存储或打开的一个文件单位。文档的主要作用是把对数据的处理从对用户界面的处理中分离出来,集中处理数据,同时提供了一个与其它类交互的接口。什么是文档?什么是文档?视图视图是文档文档在屏幕上的一个映像,它就像一个观景器,用户通过视图看到文档,也是通过视图来改变文档,视图充当了文档与用户之间的媒介物。应用程序通过视图视图向用户显示文档中的数据,并把用户的输入解释为对文档的操作。一个视图视图总是与一个文档对象相关联,用户通过与文档相关联的视图与文档进行交互。当用户打开一个文档时,应用程序就会创建一个与之相关联的视图。什么是视图?什么是视图?视图视图负
4、责显示和编辑文档数据,但不负责存储。用户对数据的编辑需要依靠窗口上的鼠标与键盘操作才得以完成,这些消息都是由视图类接收后进行处理或通知文档类,如收到窗口刷新消息时调用视图类的成员函数OnDraw()显示文档内容。视图视图还可在打印机上输出。文档文档负责数据的读写操作,数据通常被保存在文档类的成员变量中,文档类通过一个称为序列化的成员函数将成员变量的数据保存到磁盘文件中。MFC应用程序为数据的序列化提供了默认支持。视图和文档的功能:视图和文档的功能:文档、视图、框架窗口之间的关系文档、视图、框架窗口之间的关系一个视图视图是一个没有边框的窗口,它位于主框架窗口中的客户区。视图是文档文档对外显示的窗
5、口,但它并不能完全独立,它必须依存在一个框架窗口框架窗口内。一个视图只能拥有一个文档,但一个文档可以同时拥有多个视图。视图是文档在屏幕上的一个映像,它就像一个观景器文档文档/视图结构的优点:视图结构的优点:把数据处理类从用户界面处理类中分离出来,使得每一个类都能集中地执行一项工作。把Windows程序通常要做的工作分成若干定义好的类,这样有助于应用程序的模块化,程序也易于扩展,编程时只需修改所涉及的类。虽然文档/视图结构牵涉到许多类,其中的也关系比较复杂,但MFC AppWizard向导建立的MFC应用程序框架已经把程序的主要结构完成了,模块间的消息传递以及各函数的功能都已确定。MFC应用程序
6、框架起到了穿针引线的作用,按照消息处理函数功能的不同,将不同消息的响应分别分布在文档类和视图类中。文档/视图结构并没有完全要求所有数据都属于文档类,视图类也可以有自己的数据。如果在视图类中不定义任何数据,在需要时都从文档类中获取,这样做会影响程序的效率。例如,在文本编辑程序中,往往在视图中缓存部分数据,这样可以避免对文档的频繁访问,提高运行效率。在视图类中定义数据在视图类中定义数据 包含多个类的MFC文档/视图结构应用程序要管理这些类中的数据,除了考虑在程序的哪一部分拥有数据和在哪一部分显示数据,一个主要的问题是文档数据更改后如何保持视图显示的同步,即文档与视图如何进行交互。在文档、视图和应用
7、程序框架之间包含了一系列复杂的相互作用过程,文档与视图的交互是通过类的公有成员变量和成员函数实现的。5.1.2 文档与视图之间的相互作用文档与视图之间的相互作用1视图类的成员函数GetDocument()一个视图对象只有一个与之相关联的文档对象。在MFC应用程序中,视图对象通过调用成员函数函数GetDocument()得到当前文档。GetDocument()是视图类的成员函数,调用它可以返回与视图相关联的文档对象的指针,利用这个指针可以访问文档类及其派生类的公有成员。当利用MFC AppWizard向导创建一个SDI单文档应用程序Mysdi时,生成了视图类的一个派生类,并在派生类中定义了函数G
8、etDocument()。文档和视图类常用的成员函数文档和视图类常用的成员函数 一个文档对象可以有多个与之相关联的视图对象,当一个文档的数据通过某个视图被修改后,与它关联的每一个视图都必须反映出这些修改。因此,视图在需要时必须进行重绘,即当文档数据发生改变时,必须通知到所有相关联的视图对象,以便更新所显示的数据。更新与该文档有关的所有视图的方法是调用成员函数CDocument:UpdateAllViews()。2CDocument类的成员函数UpdateAllViews()5.2.2 添加菜单命令处理函数添加菜单命令处理函数 菜单实际上是一系列命令的列表,当一个菜单项被选中后,一个含有该菜单项
9、ID标识的WM_COMMAND命令消息将发送到应用程序窗口,应用程序将该消息转换为一个函数(命令消息处理函数)调用。命令消息来自于用户界面对象,是由菜单项、工具栏按钮和快捷键等程序界面元素发送的WM_COMMAND消息。在MFC应用程序中,许多类都能接收菜单被选中而引发的消息。总的来说,从类CCmdTarget派生出来的类都可以加入应用程序的消息循环。应该将菜单命令映射到哪个类中,需要由该命令的功能决定。如果一个命令同视图的显示有关,就应该将其映射到视图类;如果同文档的读写有关,就映射到文档类中;如果命令完成通用功能,一般映射到窗口框架类。有时无法对功能进行准确分类,则可以将菜单命令映射到任意
10、一个类,看看是否能够完成指定的功能。将菜单命令映射到哪个类?将菜单命令映射到哪个类?Windows是基于事件驱动、消息传递的操作系统。用户所有的输入都是以事件或消息的形式传递给应用程序的,鼠标也不例外。鼠标驱动程序将鼠标硬件信号转换成Windows可以识别的信息,Windows根据这些信息构造鼠标消息,并将它们发送到应用程序的消息队列中。5.3 鼠标消息处理鼠标消息处理鼠标构成:左键、右键(中键和滚动滑轮)鼠标操作:单击、双击、释放和移动 主要鼠标消息主要鼠标消息:WM_MOUSEMOVE:移动 WM_LBUTTONDOWN:按下左键 WM_LBUTTONUP:释放左键 WM_RBUTTOND
11、OWN:按下右键 WM_RBUTTONUP:释放右键 WM_LBUTTONDBLCLK:双击左键 5.3.1 鼠标消息鼠标消息 鼠标消息分为两类:鼠标消息分为两类:客户区鼠标消息 非客户区鼠标消息:WM_NCLBUTTONDOWN:按下鼠标左键消 WM_NCRBUTTONDOWN:按下鼠标右键.非客户区鼠标消息由Windows操作系统处理,应用程序一般不需要处理。客户区鼠标消息发送到应用程序后,可以由应用程序自己处理。通过消息结构中的消息参数wParam来区分客户区鼠标消息和非客户区鼠标消息。利用MFC ClassWizard类向导生成的鼠标消息处理函数一般都有两个参数:nFlags:类型为U
12、INT,表示鼠标按键和 键盘上控制键的状态。point:类型为CPoint,表示鼠标当前所 在位置坐标。鼠标消息处理函数参数鼠标消息处理函数参数第第 二十九二十九 讲讲主讲教师:隋振学时:主讲教师:隋振学时:32 使用鼠标的一个典型例子就是绘图程序,鼠标被用作画笔,绘图过程中要进行不同鼠标消息的处理,如按下鼠标、释放鼠标和移动鼠标等。当用户按下鼠标左键时必须记录下当前鼠标的位置,当用户移动鼠标时,如果鼠标左键被按住,则从上一个鼠标位置到当前位置画一段直线,并保存当前鼠标的位置,供下一次画线用。当用户弹起鼠标左键时释放鼠标。5.3.1 鼠标消息处理举例:鼠标消息处理举例:绘图程序绘图程序 例例
13、编写一个绘图程序,程序运行后,当用户在客户区窗口按下鼠标左键并移动时,根据鼠标移动的轨迹绘制出指定的线段。类似于画图软件 1、设计CLine类2、在文档中添加Cline数组和表示线数量的变量3、在构造函数中初始化4、在视类中添加Cline型变量,保存当前线5、添加变量BOOL型,记录左键是否按下6、添加鼠标的函数第第 三十三十 讲讲主讲教师:隋振学时:主讲教师:隋振学时:32OnLButtonDown,记线起点,和鼠标按下标记OnMouseMove,先擦原线,再画新线OnLButtonUp,记录新线到文档中7、OnDraw()8、文档中保存第第 三十一三十一 讲讲主讲教师:隋振学时:主讲教师:
14、隋振学时:32void CMyDrawView:OnLButtonDown(UINT nFlags,CPoint point)/TODO:Add your message handler code here and/or call defaultm_bIsMouseDown=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
15、.y;/相当于线长度是零CView:OnLButtonDown(nFlags,point);void CMyDrawView:OnMouseMove(UINT nFlags,CPoint point)/TODO:Add your message handler code here and/or call defaultif(m_bIsMouseDown)CClientDC ClientDC(this);ClientDC.SetROP2(R2_NOT);/按取反方式画图m_Line.Draw(&ClientDC);/先画一遍,擦除源曲线m_Line.m_nX2=point.x;/设置新值m_Li
16、ne.m_nY2=point.y;m_Line.Draw(&ClientDC);/再画一遍CView:OnMouseMove(nFlags,point);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_Line.m_nX2=point.x;/设置终点m_Line.m_nY2=po
17、int.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:/定义有关鼠标作图的成员变量Cline m_Line;/保存当前线段保存当前线段bool m_bDraggi
展开阅读全文