书签 分享 收藏 举报 版权申诉 / 107
上传文档赚钱

类型第5章windows程序设计教案课件.ppt

  • 上传人(卖家):三亚风情
  • 文档编号:2878546
  • 上传时间:2022-06-07
  • 格式:PPT
  • 页数:107
  • 大小:1.36MB
  • 【下载声明】
    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按扭

    14、关闭对话框 在CGragh类中定义纯虚函数Draw():在ClassView中双击CGragh打开头文件-在类的定义中添加纯虚函数Draw(),考虑到图元绘制自己时需要设备环境,所以参数设计为设备环境对象的指针 为项目添加直线类、矩形类、椭圆类: Insert-New Class-将Class type改为Generic Class-在Name中输入新类的类名,例如CLine-在Derived from中输入基类名称,这里是CGragh-点击OK按扭关闭对话框-以类似方法添加矩形类和椭圆类 在直线类、矩形类、椭圆类的头文件中添加成员变量用以保存坐标,并重载Draw()和Serialize()。

    15、注意重载Serialize()时要添加规定的宏 在直线类、矩形类、椭圆类的源文件中对Draw()和Serialize()进行编程 修改视图类的鼠标左键弹起消息处理函数:此时代表用户已经画完一个图元,所以程序需要动态创建相应的图元对象,将坐标保存进图元对象,然后将图元对象的指针存入文档类的链表中。最后要设置文档类中的一个标志,告诉程序数据已经修改过了。注意要在视图类的源文件开头将所有自定义类的头文件包含进来。(例程中所有自定义类都放在Graph.h中,所以只包含进了它) 对视图类的OnDraw()函数进行编程:这个函数的前两条语句是自带的,目的是获得文档类对象的指针。我们只需要通过该指针获得文档

    16、类中的链表,并从链表头位置开始遍历链表,当取得每一个元素时,调用其Draw()虚函数命令该图元绘制自己。由于链表类返回的指针类型是CObject *,所以调用Draw()前需要强制类型转换为CGragh *。 在文档类中重载两个虚函数Serialize()、 DeleteContents():View-ClassWizard-在Class name中选择自己的文档类-在Object IDs中选择第一项,即文档类类名-在Messages中选择Serialize-点击“Add Function”按扭-以类似方法重载DeleteContents()-点击OK按扭关闭ClassWizard 对文档类的

    17、Serialize()进行编程,实现图元的存盘打开:只需要调用链表对象的Serialize()即可,它会自动调用每个元素的Serialize()进行真正的存盘打开操作。 对文档类的DeleteContents()进行编程,实现新建文档时删除原有的数据:遍历链表,取得每个元素后释放这个元素的内存,最后清空链表中存放的指针。思考: 第2个版本还差最后一个处理步骤,这个步骤是什么?应在哪个源文件的哪个函数中进行?课堂作业: 1. 第2个版本中,在抽象类CGraph中定义纯虚函数Draw()的目的是什么? 2. 视图类的OnDraw()函数在什么情况下会被调用?它的工作内容是什么?画出它的流程图。5.

    18、3 支持滚动的绘图程序5.3.1 目的 学习对话框的创建和使用;学习创建滚动视图的方法;学习Windows的坐标系统及其转换。5.3.2 对话框 作用:对话框是应用程序创建的用来获取用户输入的一个临时窗口。应用程序一般用对话框来提示用户输入附加信息。应用程序和用户的交互手段是通过对话框中的各种控件。 类型:模态对话框在对话框返回之前,应用程序不能继续运行。非模态对话框在对话框返回之前,应用程序可以进行其它操作。 创建方法:首先必须使用资源编辑器创建一个对话框模板,并给这个模板创建一个对话框类。之后,如果想以模态的形式显示这个对话框,可使用对话框类的DoModal()函数;如果想以非模态的形式显

    19、示,可先使用对话框类的Create(),然后使用对话框类的ShowWindow()。5.3.3 设计思路 首先应给项目添加滚动动能,在MFC中,只要把自己视图类的基类指定为CScrollView即可 在新建一个文档的时候,应该允许用户指定图画的大小,这可以通过提供一个对话框来与用户交互 由于有了滚动条,逻辑坐标和客户坐标可能不相等了,所以凡是涉及到绘图和保存的地方,都要把鼠标消息处理函数接收的客户坐标转换为逻辑坐标5.3.4 步骤 将视图类改为从CScrollView派生:在视图类的头文件中手工修改 把视图类的源文件中的所有CView替换成CScrollView 添加一个对话框,用于输入图画的

    20、尺寸:ResourceView-右键单击Dialog-Insert Dialog-加入两个静态文本框和两个编辑框,删掉原有的“取消”按扭和静态文本框-在两个编辑框中单击右键,选“Propertis”,为它们指定容易记忆的ID 在对话框中空白处双击,按照提示,创建一个对话框类 使用类向导的“Member Variables”页为两个编辑框创建对应的成员变量 使用类向导为对话框的“确定”按扭添加消息处理函数,在其中将用户输入的数字保存在对话框类的成员变量中 使用类向导,在文档类中重载OnNewDocument()虚函数,并对其编程,完成初始新建、弹出对话框并保存图画尺寸的任务 在视图类中重载OnI

    21、nitialUpdate(),在其中设置滚动尺寸 修改视图类的OnDraw(),在其中判断是否开始创建新图画,如果不是则用灰色填充客户区,如果是则绘图 在3个鼠标消息处理函数中进行坐标转换(客户坐标转换为逻辑坐标) 修改文档类的Serialize()函数,添加图画尺寸和第一次打开文档时的操作。课堂作业: 1. 在什么情况下客户坐标和逻辑坐标可能不相等? 2. CDC类的绘图函数的参数都是使用的什么坐标? 3. 写出将客户坐标转换为逻辑坐标的代码。5.4 锦上添花的绘图程序5.4.1 目的 学习鼠标的控制方法;学习创建和使用画笔和画刷;学习添加状态栏窗格并对其进行操作;初步训练较复杂功能的独立思

    22、考。5.3.2 步骤 当程序刚启动时,装入十字光标以备用。注意同时要在头文件中添加一个HCURSOR类型的成员变量 当鼠标移动到客户区后,改变光标的形状为十字光标 当用户按下鼠标左键准备画图时,将鼠标钳定在客户区内 当用户画完一个图元后,释放鼠标的钳定 添加画笔和画刷的菜单以及它们的消息处理函数 对画笔和画刷的的消息处理函数编程:类型和宽度的消息处理函数只要对相应成员变量赋值即可,颜色的消息处理函数需要使用系统自带的颜色对话框 修改直线、矩形和椭圆类的头文件,加入画笔和画刷的成员变量 修改直线、矩形和椭圆类的Draw()函数 修改直线、矩形和椭圆类的Serialize()函数 修改鼠标左键弹起

    23、消息处理函数,在保存图元数据时添加画笔、画刷信息 修改鼠标左键弹起消息处理函数,用指定的画笔画刷将刚创建的图元绘制出来 为项目添加一个资源ID,用于表示状态栏窗格:ResourceView-右键单击第1行-Resource Symbols -New 为项目添加一个字符串,给它适当的长度以表示状态栏窗格的长度:ResourceView-String Table-右键单击任意行-New String-在ID中输入刚才的资源ID,在Caption中输入适当长度的空格 在主框架类的源文件中的indicators全局数组中添加刚才的资源ID 在主框架类的头文件中添加一个自定义函数用于在状态栏窗格中显示坐

    24、标 对这个自定义函数编程 修改视图类的鼠标移动消息处理函数,让它调用主框架类的那个自定义函数去显示坐标 修改视图类的鼠标移动消息处理函数,实现靠边滚动思考: 在鼠标左键弹起时,有一种最简便的办法同样可以用指定的画笔画刷绘制出刚创建的图元,并且这种方法完全没有闪烁,是什么方法?课堂作业: 1. 写出将鼠标钳制在客户区矩形以内的代码。 2. 假设要用红色画出一条直线,起点和终点分别是P1和P2,写出创建画笔、将画笔选进设备环境、绘制直线、恢复画笔的代码。5.5 使用UpdateCmdUI进行坐标显示的绘图程序5.5.1 目的 了解UpdateCmdUI的作用和触发时机;使用它进行状态栏窗格的显示控

    25、制。5.5.2 UpdateCmdUI:只要用户界面部件正在显示,就会发出这条消息5.5.3 步骤 在主框架类的源文件的消息映射中手工添加状态栏窗格的UpdateCmdUI消息映射 在主框架类的头文件的AFX_MSG宏中手工添加OnUpdatePane()函数 对OnUpdatePane ()进行编程5.6 可以选取并删除图形的绘图程序5.6.1 目的 定时器的使用方法;加深对面向对象理论中的虚函数的理解;训练处理程序的逻辑功能的能力。5.6.2 设计思路 怎样让用户选中一个图元呢?本程序设计为当用户在图元周围3个像素内点击时,就选中该图元 怎样反馈用户已经选中某图元呢?本程序让图元闪烁显示来

    26、反馈。这就要用到定时器 为了在闪烁显示时能迅速找到被选中的图元,我们另外用一个链表来存放被选中的图元的指针 删除被选中的图元时,要在保存所有图元的链表中查找被选中图元,找到后将其删除并释放内存。同时要取消定时器5.6.3 步骤 在“编辑”下拉菜单中添加“选取”、“取消选取”和“删除”菜单项,并创建它们的消息处理函数 修改抽象类CGraph,加入纯虚函数IsSelected()和SelectedDraw(),并在3个派生类中重载和实现这两个纯虚函数 在“选取”菜单的消息处理函数中设置选择状态标志 在文档类的头文件中添加一个专门保存被选中图元的链表 修改鼠标左键按下的消息处理函数,判断如果是选择状态,则依次检查是否选中了某个图形。如果选中,则将其加入专门保存被选中图元的链表,并启动定时器 使用类向导,在视图类中添加定时器消息处理函数 对定时器消息处理函数编程,在其中命令所有被选中的图元用闪烁的方式绘制自己 在“取消选择”菜单的消息处理函数中,销毁定时器,重画所有被选中图形,并清空保存被选中图元的链表 在“删除”菜单的消息处理函数中,在文档类的m_Graphs中查找被选中图元,找到后从链表中删除。最后重画整个客户区

    展开阅读全文
    提示  163文库所有资源均是用户自行上传分享,仅供网友学习交流,未经上传用户书面授权,请勿作他用。
    关于本文
    本文标题:第5章windows程序设计教案课件.ppt
    链接地址:https://www.163wenku.com/p-2878546.html

    Copyright@ 2017-2037 Www.163WenKu.Com  网站版权所有  |  资源地图   
    IPC备案号:蜀ICP备2021032737号  | 川公网安备 51099002000191号


    侵权投诉QQ:3464097650  资料上传QQ:3464097650
       


    【声明】本站为“文档C2C交易模式”,即用户上传的文档直接卖给(下载)用户,本站只是网络空间服务平台,本站所有原创文档下载所得归上传人所有,如您发现上传作品侵犯了您的版权,请立刻联系我们并提供证据,我们将在3个工作日内予以改正。

    163文库