简单画图软件(初级篇)义.ppt_第1页
简单画图软件(初级篇)义.ppt_第2页
简单画图软件(初级篇)义.ppt_第3页
简单画图软件(初级篇)义.ppt_第4页
简单画图软件(初级篇)义.ppt_第5页
已阅读5页,还剩58页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

简单画图软件的实现,指导教师:徐雅静,简单画图软件的实现,1、题目 2、相关MFC的知识,一、题目,名称:简单画图软件的实现 程序框架:基于单文档的应用程序。 软件形式: 可以参考Windows操作系统中“附件”里的画图软件。,一、题目,程序基本功能: 1. 能够绘制直线、曲线; 2.能够绘制各种形状,比如矩形、椭圆形等 3.能够绘制各种实心形状,比如实心矩形、实心椭圆等 4.能够添加文字 5.能够设置不同的绘制颜色,一、题目,程序可选功能: 1. 能够显示磁盘上已有的图片文件 2. 能够具备“橡皮擦”的功能,进行擦除 3. 能够保存绘制后的图形 4.其他认为应该增加的绘图功能,二、相关MFC的知识,1、创建基于单文档的工程 2、CView类的使用 3、CDC相关类的使用 4、菜单栏和工具条的使用,2. 创建基于单文档的工程,步骤 1、选择工程类别MFC AppWizard(exe) 2、选择应用程序类别 Single Document 3、不需支持数据库 4、不需支持额外的系统功能 5、选择程序外观 6、选择程序风格 7、确认相关类名称 8、完成,1、选择工程类别MFC AppWizard(exe),选择MFC AppWizard(exe),2、选择应用程序类别Single Document,选择Single Document,3、不需支持数据库,4、不需支持额外的系统功能,5、选择程序外观,6、选择程序风格,7、确认相关类名称,8、完成,运行,MFC单文档应用程序,包含四个主要的类: 应用类 主框架窗口类 文档类 视图类,系统自动生成的代码说明,1、CPaintApp类 应用类,该类中包含程序的入口函数InitInstance(),类似于main()函数。 对应的文件Paint.h和Paint.cpp。,工程名称Step1,系统自动生成的代码说明,2、CMainFrame类 框架类,用来显示一个标题、一个菜单条、窗口最大化和最小化键、边框、一个系统菜单、工具条以及状态条等。 对应的文件MainFrm.h和MainFrm.cpp,右应用程序类调用,系统自动生成的代码说明,3、CPaintDoc类 由MFC的 CDocument类派生 负责存放程序数据并读写磁盘文件数据。 在建立一个图形系统时,存储图形元素的数据结构等都是放在文档类中。 对应的文件Paintdoc.h和Paintdoc.cpp。,系统自动生成的代码说明,4、CPaintView类 由MFC的类CView派生。 负责显示文档类的数据,可以显示在屏幕上,也可以输出到打印机或其他设备上。 负责处理用户的输入 在屏幕上,这个类管理客户窗口。 在实现一个图形系统时,屏幕上显示、打印机上绘图的工作都是由视图类完成的。 对应的文件Paintview.h和Paintview.cpp。,2、CView类的使用,一CView类对象的工作机制 消息流 当CView类对象收到以各种方式传入的消息后,便会通过自己的一系列函数(如:Ondraw 、OnPrepareDC、OnPaint等)响应,然后再将消息传给专用于描述输出设备的CDC对象。,2、CView类的使用,基于MFC的应用程序内都含有一个缺省定义的CDC类对象,所以当应用软件系统执行时,一个CView 类对象实际上已经与一个缺省的CDC类对象连接起来了。 一个Windows 应用软件系统在其视图中显示的全部成份通常是经过CView类的成员函数OnDraw()传递给与之相连的CDC类对象的。,2、CView类的使用,OnDraw函数是被CView类下的消息处理函数OnPaint()调用的。 OnPaint()函数的代码: void CView:OnPaint() /standard paint routine CPaintDC dc(this); OnPrepareDC( ,2、CView类的使用,当WM_PAINT消息产生时,如果用户应用程序的视图类中没有对OnPaint函数重载, 则该消息发给基类CView的OnPaint(), 再调用用户应用程序的OnDraw()。 CView的OnDraw是纯虚函数。故要想在应用程序中显示内容,重载OnDraw, 或重载OnPaint.,3、CDC相关类的使用,绘图要用到MFC的类CDC、CPaintDC、CClientDC、CWindowDC等,其中 CDC类是基类,另外几个类是为了特殊应用由其派生出来的。,3、CDC相关类的使用,一 绘图类CDC类简介 CDC类是CObject类的一个派生类,CDC类是MFC中专用于描述输出设备(特别是显示和打印设备)特性的类, 它实现了较多的图形操作, CDC类是所有绘图类的基类。 CDC类定义了一个设备描述表对象。(设备描述表抽象为CDC),CDC类提供的成员函数用于:, 操作设备描述表 使用绘图工具 选择图形设备界面(GDl) 操作颜色和调色板 取得和设置绘图属性、映射方式 确定视口和窗口范围 坐标转换、区域的使用 剪取、画线 绘制简单的形状、椭圆和多边形 绘制文本,3、CDC相关类的使用,总之,CDC类中包含了与图形绘制有关的大部分操作,CDC类实际上是把普通C语言与绘图有关的函数通过类封装到一起。,3、CDC相关类的使用,起辅助作用的图形库函数: CGdiObject(基类) CBitmap 位图类 CBrush 绘图方式类 CFont 字体/字型类 CPalette 调色板类 CPen 绘图工具类 CRgn 绘图区域类 称这些类为绘图对象类。绘图类可被选取完成图形的操作(相当于工具)。,3、CDC相关类的使用,当CView类对象需要在视图中,对显示器进行输出、绘制任何图形和文字时,除了要向CDC类对象发出消息外,还有可能将所需要的CGdiObject的派生类对象以消息参数的形式也一同提交给CDC类对象。,3、CDC相关类: CPen类,CPen类模拟画笔图形设备界面。 (1)建立CPen 对象方法: 定义个CPen对象,用其成员函数CreatePen或CreatePenIndirect对其进行初始化。 CPen pen; pen.CreatePen(PS_SOLID,1,RGB(255,0,0); 构造函数建立个Cpen对象,并一次性地定义它的所有参数。 CPen pen(PS_SOLID,1,RGB(255,0,0); 用指针对象的形式动态创造一个画笔。 CPen *pen; pen new CPen(PS_SOLID,1, RGB(255,0,0); delete pen;,3、CDC相关类: CPen类,不论是采用哪一种方法,都是用三个参数来初始化画笔,这三个参数是线型(nPenStyle),线宽(nWidth)和颜色(COLORREF crColor)。 参数nPenStyle设置画笔画线的线型; 参数nWidth设置以逻辑单位表示的线宽; 参数crColor设置画笔的颜色,利用RGB宏指定颜色非常简单: COLORREF RGB(cRed,cGreen,cBlue); 参数cRed、cGreen、cBlue分别指定红、绿、蓝三色的相对亮度,每个参数均赋予0到255之间的值。,例如:,(2)在绘图对象中选入画笔 void CDrawView:OnDraw(CDC *pDC) /定义并初始化一个画笔实例 CPen pen(PS_SOLID, 1, RGB(255, 0 ,0); / 将画笔选入绘/图对象 CPen * pOldPen = pDC-SelectObject( /恢复原有的画笔对象 ,3、CDC相关类: CBrush类,CBrush类模拟一个Windows画刷图形设备界面。 用法与CPen类似。 (1)构造CBrush对象 CBrush类有四个构造函数。 CBrush() CBrush(COLORREF crColor) CBrush(CBitmap* pBitmap) CBrush:CBrush(int nIndex, COLORREF crColor) 一次性构造 CBrush brush(RGB(255,0,0);,3、CDC相关类: CBrush类,用画刷指针定义。 CBrush *brush; brush = new CBrush(RGB(255,0,0); delete brush; 用函数CreateSolidBrush构造。 CBrush brush; brushCreateSolidBrush(RGB(255,0,0);,例如:,(2)在绘图对象中选入画刷 void CDrawView:OnDraw(CDC * pDC) CBrush brush(HS_CROSS, RGB(255, 0, 0); /定义并初始化一个画刷实例 CBrush * pOldBrush=pDC-SelectObject( /恢复原来的画刷 ,3、CDC相关类: CFont类,CFont类模拟字体。 (1)构造CFont对象 CFont类只有一个构造函数. CFont( ); 定义一个CFont类的对象后,必须用成员函数CreateFont或CreateFontIndirect 来确定字体对象的参数。,3、CDC相关类: CRgn类,CRgn类封装了区域的种种特性和操作,它是窗口中的椭圆或多边形范围的组合,可被用来进行填充、反显、移动、判定某点是否在区域等操作,3、CDC相关类: CBitmap类,CBitmap类封装了处理位图的方法。,例1,一在视图中直接显示文字和绘图 由于在Windows的视中的任何信息(包括文字)都是图形,所以在视中直接显示文字和绘图没有任何区别。如果程序员无任何特殊要求,可以直接通过修改OnDraw()成员函数实现在用户的视中显示文字和绘制各种标准的几何图形。,例1,在CView类的OnDraw()成员函数内“/ TODO: add draw code for native data here”注释的下一行首并键入下述语句: pDC-SelectStockObject(ANSI_FIXED_FONT); pDC-TextOut(10,0,“画一个圆:“); pDC-MoveTo(10,16); pDC-LineTo(115,16); pDC-SelectStockObject(GRAY_BRUSH); pDC-Ellipse(10,20,210,220);,例1,TextOut()函数参数表中的前两个数字分别表示显示的起点坐标,其单位为显示器物理的点(横向)数和线(纵向)数。 Ellipse()函数参数表的四个数值与C图形库函数内的同名函数参数相同,分别表示圆外接矩形的对角坐标。 MoveTo()和LineTo() 函数是在显示的文字下方画一直线。,4、菜单栏和工具条的使用,在Windows应用程序框架中,使用菜单、工具条、状态条等与用户交互操作和进行信息提示。还可以为命令消息ID号设置加速键,以键盘操作的形式激发命令消息。,4、菜单栏和工具条的使用,例1 学习如何使用菜单,步骤 1、添加菜单项 2、添加菜单项的消息处理函数 3、添加鼠标的消息处理函数 4、添加代码,绘制直线 5、测试,例1:,1、添加菜单项 在建好的Single document文档中,选择“Resource view”,选择“Menu”,双击空白菜单项,弹出“属性对话框”,可以添加菜单,如下图所示。 属性对话框中对于顶层菜单项,只需要填写菜单名称;子菜单项需要填写资源ID和菜单名称。,例1:1、添加顶层菜单项,1双击空白菜单项,2 弹出菜单属性,例1:1、添加子菜单项,1双击空白菜单项,2 弹出菜单属性,例1:1、添加子菜单项,1双击空白菜单项,2 弹出菜单属性,2、添加菜单项的消息处理函数,点击“view”classWizard”,弹出对话框,在“paint”工程下,在”Paintview”视图下,找到刚才设置的菜单项的资源ID,即ID_LINE,添加一个消息事件“Command”,2、添加菜单项的消息处理函数,1选择CPaintView,2选择菜单ID,3选择Command消息,2、添加菜单项的消息处理函数,每一个菜单项可以响应两种消息: Command: 鼠标点击消息,通常使用该消息 Update_Command_UI: 菜单项状态改变消息,比如菜单项选中或未选中状态。,2、添加菜单项的消息处理函数,1 添加消息处理函数,2 连续点击“OK”,3、添加鼠标的消息处理函数,为CPaintView添加添加鼠标消息 鼠标左键按下WM_LBUTTONDOWN: 绘制直线开始 鼠标左键抬起WM_LBUTTONUP : 绘制直线结束 鼠标移动WM_MOUSEMOVE: 随鼠标绘制直线,3、添加鼠标的消息处理函数,1 鼠标处理函数,2生成的消息处理函数,4、添加代码,绘制直线,1)在CPaintView的类声明中添加一个公有成员 int type; /绘制图形类别,1代表直线,2代表矩形 bool flag; /绘制开始、结束标记 int x1, y1; int x2, y2; x1,y1表示绘制直线的起始坐标, x2, y2直线终点坐标,由鼠标左键按下抬起确定。,4、添加代码,绘制直线,2)在CPaintView的构造函数中初始化flag CPaintView:CPaintView() / TODO: add construction code here type = 0; /代表不绘制任何类型的图形 flag = false; /停止绘制图形 ,手动添加的代码,4、添加代码,绘制直线,3) 在刚才生成的OnLine函数中,设置flag=1;表示要画直线 void CPaintView:OnLine() / TODO: Add your command handlercode here type=1; ,手动添加的代码,4、添加代码,绘制直线,4)在鼠标左键按下时,设置起始坐标 void CPaintView:OnLButtonDown(UINT nFlags, CPoint point) / TODO: Add your message handler code here and/or call default x1 = point.x ; y1 = point.y ; flag = true; CView:OnLButtonDown(nFlags, point); ,手动添加的代码,4、添加代码,绘制直线,5)在鼠标左

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论