第5章windows程序设计教案课件.ppt
- 【下载声明】
1. 本站全部试题类文档,若标题没写含答案,则无答案;标题注明含答案的文档,主观题也可能无答案。请谨慎下单,一旦售出,不予退换。
2. 本站全部PPT文档均不含视频和音频,PPT中出现的音频或视频标识(或文字)仅表示流程,实际无音频或视频文件。请谨慎下单,一旦售出,不予退换。
3. 本页资料《第5章windows程序设计教案课件.ppt》由用户(三亚风情)主动上传,其收益全归该用户。163文库仅提供信息存储空间,仅对该用户上传内容的表现方式做保护处理,对上传内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(点击联系客服),我们立即给予删除!
4. 请根据预览情况,自愿下载本文。本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
5. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007及以上版本和PDF阅读器,压缩文件请下载最新的WinRAR软件解压。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- windows 程序设计 教案 课件
- 资源描述:
-
1、第5章案例学习绘图程序5.1 最基本的绘图程序5.1.1 内容 学习菜单和工具栏按钮的创建过程;学习使用ClassWizard建立消息映射;学习基本的GDI函数的使用。5.1.2 功能演示5.1.3 设计思路 首先从用户界面入手,完成相关菜单和工具栏的创建。 为必要的消息和命令建立各自的处理函数。 当用户按下鼠标左键准备画图时,程序需要记录当前鼠标坐标以当做图元的起点。 当用户拖动鼠标时,程序需要不断修改图元的终点并及时画出橡皮条。 当用户弹起鼠标左键时结束一次绘图操作。 各个消息处理函数应该放在哪一个类里比较好呢?原则是哪里方便进行绘图操作就放在哪个类里。由于绘图是在客户区中进行的,客户区是
2、用视图来表示的,所以这些变量和函数都应该放在视图类中。 另外要了解,鼠标消息处理函数接收的坐标是客户坐标,而绘图函数所使用的坐标都是逻辑坐标,本来是需要先进行转换才能绘图的,但因为此版本没有滚动功能,所以两套坐标实际是相同的,因此程序不需要进行坐标转换。5.1.4 需要用到的MFC类和成员函数 CClientDC派生自CDC,封装了HDC,专门用于在客户区中绘图 CDC:MoveTo()将画笔移动到指定位置 CDC:LineTo()画一条直线到指定位置 CDC:Rectangle()在指定位置画一个矩形 CDC:Ellipse()在指定位置画一个椭圆 CDC:SetROP2()设置绘图模式 C
3、DC:SelectStockObject()选择库存的绘图工具对象5.1.5 步骤 使用向导创建一个MFC单文档界面的应用程序,其他设置保持不变 创建下拉菜单和菜单项:ResourceView-Menu-双击打开-在最后的空白项中单击右键-Properties-在Caption中输入希望的下拉菜单名称,这里是“绘图”-回车或点击关闭按扭关掉Properties对话框-在“绘图”下拉菜单中的空白项中单击右键-Properties-在ID中输入便于记忆的标志符,例如直线为“ID_DRAW_LINE”-在Caption中输入希望的菜单项名称,例如“直线”-在Prompt中输入“绘制直线n直线”格式的
4、提示-回车或点击关闭按扭关掉Properties对话框-以类似方法建立“矩形”和“椭圆”两个菜单项 创建工具栏按钮:ResourceView-Toolbar-双击打开-单击最后的空白按扭-以绘图的方式创建“直线”的按扭,绘图工具和颜色在右边的工具栏中选择-双击画好的直线按扭,在ID中选择前面创建“直线”菜单项时指定的ID -回车或点击关闭按扭关掉对话框-以类似方法建立“矩形”和“椭圆”两个按扭 添加菜单项的消息处理函数:View-ClassWizard-在Class name中选择自己的视图类-在Object IDs中选择前面创建“直线”菜单项时指定的ID-在Messages中选择COMMAN
5、D-点击Add Function按扭-在Messages中选择UPDATE_COMMAND_UI-点击Add Function按扭-以类似方法建立“矩形”和“椭圆”两个菜单项的命令处理函数-点击OK按扭关闭ClassWizard 对菜单项的消息处理函数进行编程: a. 对COMMAND消息的处理函数进行编程:在这些函数里不需要进行绘图,只要让程序记录下用户选择了哪个图元。我们用一个整型变量来记录这个信息。由于菜单项的消息处理函数是视图类的成员函数,所以这个整型变量应该定义为视图类的成员变量。 b. 对UPDATE_COMMAND_UI消息的处理函数进行编程:这个函数的调用时机是下拉菜单刚被拉下
6、的时刻,作用是让我们对该用户界面部分进行特定的设置。这里我们通过判断决定是否在这个菜单项的前面打上勾。 添加鼠标的消息处理函数: View-ClassWizard-在Class name中选择自己的视图类-在Object IDs中选择第一项,即自己的视图类的类名-在Messages中选择WM_LBUTTONDOWN-点击Add Function按扭-在Messages中选择WM_LBUTTONUP-点击Add Function按扭-在Messages中选择WM_MOUSEMOVE-点击Add Function按扭-点击OK按扭关闭ClassWizard 对鼠标消息处理函数进行编程: a. 对鼠
7、标左键按下的消息处理函数进行编程:只需要告诉程序已经开始绘图了并记录下图元的起点即可。这个起点就是鼠标的当前点,也就是这个消息处理函数接收的第2个参数。另外,考虑到后面的鼠标移动消息处理函数中需要处理图元的终点,所以在这里也把终点初始化了。自己的代码结束后,应该调用基类的同名成员函数来做一些默认操作。 b. 对鼠标移动消息处理函数进行编程:在这个函数中要实现橡皮条。方法是先擦除掉旧位置的图元,然后绘制新位置的图元。这可以通过把绘图模式设置为屏幕反色而实现。函数的一开头先判断当前用户是否在绘图,如果是,则创建一个代表客户区的设备环境对象,并把绘图模式设置为屏幕反色以及选择库存的空心画刷对象。接着
8、,先重画旧位置图元,然后画新位置图元,并更新图元的终点。最后,恢复原来的画刷。由于CClientDC类的析构函数会自动释放设备环境,所以程序中不用象第1章那样调用DeleteObject()来释放设备环境。 c. 对鼠标左键弹起的消息处理函数进行编程:判断当前是否正在绘图,如果是,则告诉程序结束了一次绘图。总结: Windows程序设计要以一种“被动式”的思维方式来思考,程序员的注意力集中在各个消息处理函数的编程上。当然,在编程前,必须先建立起用户界面和确定程序感兴趣的消息。思考: 第1个版本的绘图程序在某些时候会发生显示异常,这些异常发生的原因是什么?第2个版本应该如何修改?课堂作业: 画出
9、鼠标移动消息的处理函数的详细流程图。5.2 支持文档视图结构的绘图程序5.2.1 内容 文档类中保存数据的方法;文档/视图结构联合工作的方法;使用文档类的Serialize()函数保存和打开文档;巩固面向对象编程。5.2.2 功能演示5.2.3 设计思路 该版本的核心是处理图元的坐标数据,所以第一个问题就是程序运行期间,这些数据如何存放。由于文档类是专门用来存放程序数据的,所以应该放在文档类中。又由于这些数据是有相关性的,所以我们用一个链表来组织它们。 MFC的链表类CObList只能存放对象的指针,所以我们必须把各种图元分别定义成类。类中要包含这种图元的坐标和一些基本的操作。首先想到的操作是
10、绘图。另外,由于我们要实现存盘打开,所以还必须有Serialize()函数,而这个函数是CObject的,所以我们的图元类只能从CObject派生,然后重载Serialize()。CObjectCLineCRectangleCEllipse直线的坐标Draw()Serialize()矩形的坐标Draw()Serialize()椭圆的坐标Draw()Serialize() 面向对象的理论告诉我们,当类中有某些相同的成员函数时,应该将它们提出来,创建基类,并且在基类中应该把它们定义成纯虚函数。这里,Serialize()不需要提出来,只要提Draw()即可。CObjectCLineCRectang
11、leCEllipse直线的坐标Serialize()矩形的坐标Serialize()椭圆的坐标Serialize()CGraghDraw() 数据的组织形式有了,下面就是如何取得这些数据并显示在客户区的问题。既然涉及到显示,当然是视图类的功能。前面讲了,视图类的OnDraw()函数就是WM_PAINT消息的处理函数,专门负责在客户区绘制,所以我们需要对这个函数进行编程,实现从文档类获取数据并显示在客户区的功能,这就要用到文档/视图结构的联合工作。文档文档/ /视图结构的工作机制视图结构的工作机制视图类通过视图类通过GetDocument()GetDocument()成员函数获得指向文档类成员函
12、数获得指向文档类对象的指针对象的指针通过该指针获得文档通过该指针获得文档类中的数据类中的数据视图类把数据显示视图类把数据显示于客户区中于客户区中用户通过与客户区用户通过与客户区的交互来对数据进的交互来对数据进行修改行修改视图类通过调用文档类的视图类通过调用文档类的成员函数将经过修改的数成员函数将经过修改的数据保存回文档类据保存回文档类如果用户发出保存命令,则文档对象将如果用户发出保存命令,则文档对象将修改过的数据保存到永久介质修改过的数据保存到永久介质( (如磁盘如磁盘文件文件) )中中 在存盘和打开的时候,系统自动调用文档类的Serialize()函数,我们应该在这个函数中把链表中的每个图元
13、对象的坐标都存盘或读出。前面已讲,链表类的Serialize()函数会自动调用每个元素的Serialize()函数。所以我们应该对各个图元类的Serialize()函数进行编程,实现真正的坐标存盘或读出。 新建一个文档的时候,需要清除上一个文档的数据,即把链表中保存的原有图元清空。5.2.4 步骤 在文档类的定义中添加一个CObList对象做为成员变量 为项目添加一个新类CGraph:Insert-New Class-将Class type改为Generic Class-在Name中输入新类的类名,这里是CGragh-在Derived from中输入基类名称,这里是CObject-点击OK按扭
展开阅读全文