《MFC经典绘图清华大学.ppt》由会员分享,可在线阅读,更多相关《MFC经典绘图清华大学.ppt(31页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、MFMFC C绘图绘图MFC编程学习的基本目标编程学习的基本目标可以进行简单的基于可以进行简单的基于MFC的图形界面编程的图形界面编程理解理解Windows编程的基本概念。编程的基本概念。鉴于教学时间进度限制,更复杂的应用程序开发通过鉴于教学时间进度限制,更复杂的应用程序开发通过自学完成。自学完成。实现基本实现基本MFC应用程序需要掌握如下内容:应用程序需要掌握如下内容:Windows编程基本概念编程基本概念文档文档/视图结构视图结构文档读写文档读写对话框及标准控件的使用对话框及标准控件的使用菜单栏的使用菜单栏的使用绘图及鼠标消息的处理绘图及鼠标消息的处理11/27/20222主要内容主要内容
2、GDI与设备环境(与设备环境(DC)用用CDC绘图绘图应用举例应用举例绘图工具类绘图工具类11/27/20223图形设备接口(图形设备接口(GDI)Windows提供了一个称为图形设备接口提供了一个称为图形设备接口(GraphicsDeviceInterface,GDI)的抽象接口。的抽象接口。GDI作为作为Windows的重要组成部分,负责管理用的重要组成部分,负责管理用户绘图操作时功能的转换。户绘图操作时功能的转换。用户通过调用用户通过调用GDI函数与设备打交道,函数与设备打交道,GDI通过通过不同设备提供的驱动程序将绘图语句转换为对应不同设备提供的驱动程序将绘图语句转换为对应的绘图指令,
3、避免了用户对硬件直接进行操作,的绘图指令,避免了用户对硬件直接进行操作,从而实现设备无关性(显示器或打印机)。从而实现设备无关性(显示器或打印机)。11/27/20224GDI的图形输出的图形输出应用程序可以使用应用程序可以使用GDI创建如下图形输出创建如下图形输出矢量图形:画线和填充图形,包括点、直线、曲线、多边矢量图形:画线和填充图形,包括点、直线、曲线、多边形、扇形和矩形等。形、扇形和矩形等。光栅图形:通过光栅图形函数对以位图形式存储的数据进光栅图形:通过光栅图形函数对以位图形式存储的数据进行操作,包括各种位图和图标的输出。行操作,包括各种位图和图标的输出。屏幕:对若干行和列的像素操作屏
4、幕:对若干行和列的像素操作打印机:对若干行和列的点阵输出打印机:对若干行和列的点阵输出直接从内存到显存的复制操作,速度快,内存要求高。直接从内存到显存的复制操作,速度快,内存要求高。文本:以图形方式输出文本,以逻辑坐标为单位计算输出文本:以图形方式输出文本,以逻辑坐标为单位计算输出位置,而位置,而DOS是以行为单位。用户可以设置文本的各种是以行为单位。用户可以设置文本的各种效果,如加粗、斜体、设置颜色等。效果,如加粗、斜体、设置颜色等。11/27/20225设备环境设备环境应用程序的输出面向设备环境应用程序的输出面向设备环境(DeviceContext,DC),是,是一个虚拟逻辑设备,也称设备
5、描述表或设备上下文。设备一个虚拟逻辑设备,也称设备描述表或设备上下文。设备环境环境DC是由是由GDI创建,用来代表设备连接的数据结构。创建,用来代表设备连接的数据结构。DC的主要功能的主要功能允许应用程序使用一个输出设备。允许应用程序使用一个输出设备。提供应用程序、设备驱动和输出设备之间的连接。提供应用程序、设备驱动和输出设备之间的连接。保存当前信息,例如当前的画笔、画刷、字体和位图等图形对象及保存当前信息,例如当前的画笔、画刷、字体和位图等图形对象及其属性,以及颜色和背景等影响图形输出的绘图模式。其属性,以及颜色和背景等影响图形输出的绘图模式。保存窗口剪切区域保存窗口剪切区域(Clippin
6、gRegion),限制程序输出到输出设备中,限制程序输出到输出设备中窗口覆盖的区域。窗口覆盖的区域。11/27/20226设备坐标系统设备坐标系统设备坐标系统设备坐标系统x轴自左至右,轴自左至右,y轴从上到下,坐标原点在屏轴从上到下,坐标原点在屏幕左上角幕左上角0,0XYO11/27/20227主要内容主要内容GDI与设备环境(与设备环境(DC)用用CDC绘图绘图应用举例应用举例绘图工具类绘图工具类11/27/20228设备环境类设备环境类CDCMFC封装了封装了DC,提供,提供CDC类及它的子类以类及它的子类以访问访问GDI。CDC类派生自类派生自CObject类,其子类包括类,其子类包括C
7、ClientDCCMetaFileDCCPaintDCCWindowDCCObject11/27/20229设备环境类的基本功能设备环境类的基本功能11/27/202210CDC类常用绘图函数类常用绘图函数Arc:绘制一段弧:绘制一段弧Chord:绘制弦形:绘制弦形Ellipse:绘制椭圆或圆:绘制椭圆或圆MoveTo:将当前位置移动到指定位置:将当前位置移动到指定位置LineTo:从当前位置到指定位置画一条直线:从当前位置到指定位置画一条直线Polyline:画连接指定点的折线段:画连接指定点的折线段PolyBezler:根据两个端点和两个控制点画贝塞尔曲线:根据两个端点和两个控制点画贝塞尔
8、曲线Pie:画冰块:画冰块Polygon:根据两个或两个以上的顶点绘制一个多边形:根据两个或两个以上的顶点绘制一个多边形Rectangle:根据指定的左上角和右下角坐标绘制一个矩形:根据指定的左上角和右下角坐标绘制一个矩形RoundRect:画圆角矩形:画圆角矩形SetPixel:画一个点:画一个点11/27/202211绘图颜色绘图颜色DWORD类型的类型的COLORREF数据用于存放颜色值数据用于存放颜色值“0 x00bbggrr”低位字节存放红色强度值低位字节存放红色强度值第第2个字节存放绿色强度值个字节存放绿色强度值第第3个字节存放蓝色强度值个字节存放蓝色强度值高位字节存放高位字节存放
9、0可用可用RGB宏设置颜色值,将红、绿、蓝分量值转宏设置颜色值,将红、绿、蓝分量值转换为换为COLORREF类型的颜色数据类型的颜色数据COLORREFRGB(BYTE byRed,/redcomponentofcolorBYTE byGreen,/greencomponentofcolorBYTE byBlue/bluecomponentofcolor);11/27/202212常用颜色对照表常用颜色对照表例:例:COLLORREFred=RGB(255,0,0);11/27/202213在在MFC中获取中获取DC在如在如OnDraw等函数中传递一个指向等函数中传递一个指向CDC对象的对象的
10、指针指针如如OnDraw(CDC*pDC);使用构造函数构建对象使用构造函数构建对象一般不构造一般不构造CDC对象对象在在CWnd类的类的OnPaint函数中,定义函数中,定义CPaintDC对象对象CPaintDCdc(this);在在CWnd类的其它函数中,定义类的其它函数中,定义CClientDC和和CWindowDC的对象的对象CClientDCdc(this);CWindowDCdc(this);11/27/202214CClientDC、CPaintDC和和CWindowDC的区别的区别当窗口的某个区域需要重绘时激发窗口重绘消息当窗口的某个区域需要重绘时激发窗口重绘消息WM_PAI
11、NT,相应消息,相应消息处理函数处理函数CWnd:OnPaint将被调用。将被调用。CPaintDC一般只用于一般只用于OnPaint函数函数中,在处理完窗口重绘后,中,在处理完窗口重绘后,CPaintDC对象的析构函数把对象的析构函数把WM_PAINT消消息从消息队列中清除,避免不断地重绘操作。坐标原点息从消息队列中清除,避免不断地重绘操作。坐标原点(0,0)是客户区的是客户区的左上角。左上角。CClientDC用于特定窗口客户区(窗口中除边框、标题栏、菜单栏、状态用于特定窗口客户区(窗口中除边框、标题栏、菜单栏、状态栏外的中间部分)的输出,其构造函数中包含了栏外的中间部分)的输出,其构造函
12、数中包含了GetDC,析构函数中包含析构函数中包含了了ReleaseDC,不需要显式释放,不需要显式释放DC资源。一般用于响应非重绘消息(如资源。一般用于响应非重绘消息(如键盘和鼠标消息)的绘图操作。坐标原点键盘和鼠标消息)的绘图操作。坐标原点(0,0)是客户区的左上角。是客户区的左上角。CWindowDC在整个应用程序窗口上画图,而在整个应用程序窗口上画图,而CClientDC和和CPaintDC只只能在客户区绘制图形;除非要自己绘制窗口边框和按钮,否则一般不用能在客户区绘制图形;除非要自己绘制窗口边框和按钮,否则一般不用它。坐标原点它。坐标原点(0,0)是屏幕的左上角。是屏幕的左上角。11
13、/27/202215Windows系统系统发送发送WM_PAINT消息的时机消息的时机第一次创建一个窗口时第一次创建一个窗口时改变窗口的大小时改变窗口的大小时把窗口从另一个窗口背后移出时把窗口从另一个窗口背后移出时窗口显示数据变化时,应用程序引发重绘操作窗口显示数据变化时,应用程序引发重绘操作通过通过CWnd:Invalidate、CWnd:InvalidateRect或或CWnd:InvalidateRgn函数把指定区域加到窗口的函数把指定区域加到窗口的UpdateRegion中。中。窗口的窗口的UpdateRegion不为空时,系统会自动产生不为空时,系统会自动产生WM_PAINT消息。消
14、息。11/27/202216OnDraw与与OnPaint的区别的区别OnDraw是是CView类的成员函数,不响应消息;类的成员函数,不响应消息;OnPaint是是CWnd类的成员函数,相应类的成员函数,相应WM_PAINT消息。消息。CView默认调用的默认调用的OnPaint函数如下函数如下voidCView:OnPaint()CPaintDCdc(this);OnPrepareDC(&dc);OnDraw(&dc);/调用了调用了OnDraw可见可见OnPaint函数也调用了函数也调用了CView:OnDraw函数。因而一函数。因而一般在般在OnDraw函数内添加绘图代码,完成绘图任务
15、函数内添加绘图代码,完成绘图任务11/27/202217主要内容主要内容GDI与设备环境(与设备环境(DC)用用CDC绘图绘图应用举例应用举例绘图工具类绘图工具类11/27/202218举例举例编写一个单文档编写一个单文档MFC应用程序,完成以下要求:应用程序,完成以下要求:(1)在客户区中画最大的椭圆,()在客户区中画最大的椭圆,(2)当点击鼠)当点击鼠标左键时,以鼠标左键点击的位置为中心,画一标左键时,以鼠标左键点击的位置为中心,画一个半径为个半径为20个像素的圆。个像素的圆。建立一个单文档的建立一个单文档的MFC项目项目DrawTest111/27/202219绘制椭圆方法一:修改绘制椭
16、圆方法一:修改CView类的虚函数类的虚函数OnDraw函数函数CWnd:GetClientRect得到客户区域的大小得到客户区域的大小添加绘图代码添加绘图代码11/27/202220绘制椭圆方法二:在绘制椭圆方法二:在OnPaint函数中添加绘图函数中添加绘图代码代码添加添加WM_PAINT消息处理函数消息处理函数OnPaint调用调用OnPrepareDC和和OnDraw函数,添加绘图代码函数,添加绘图代码需要添加需要添加的代码的代码11/27/20222111/27/202222鼠标点击消息处理函数鼠标点击消息处理函数在类视图中选中在类视图中选中CDrawTest1View类类在属性窗口
17、中选择在属性窗口中选择“WM_LBUTTONDOWN”消息,消息,添加消息处理函数添加消息处理函数需要添加需要添加的代码的代码11/27/20222311/27/202224主要内容主要内容GDI与设备环境(与设备环境(DC)用用CDC绘图绘图应用举例应用举例绘图工具类绘图工具类11/27/202225绘图工具类主要包括绘图工具类主要包括画笔画笔CPenCPen、画刷、画刷CbrushCbrush、字体、字体CFontCFont、位图、位图BitmapBitmap和调色板和调色板CpaletteCpalette等。等。类继承关系如图类继承关系如图CObject绘图工具类绘图工具类CGdiObj
18、ect11/27/202226CPen类:类:GDI画笔,用于画线。默认的画笔用于绘制画笔,用于画线。默认的画笔用于绘制与一个像素等宽的黑色实线。与一个像素等宽的黑色实线。CBrush类:类:GDI画刷,用来填充一个封闭图形对象画刷,用来填充一个封闭图形对象(如如矩形、圆形矩形、圆形)的内部区域,默认的画刷颜色是白色。的内部区域,默认的画刷颜色是白色。CFont类:类:GDI字体,用来绘制文本,可设置文字的大字体,用来绘制文本,可设置文字的大小、是否加粗、是否斜体、是否加下划线等。小、是否加粗、是否斜体、是否加下划线等。CBitmap类:类:GDI位图,用于填充区域。位图,用于填充区域。CPa
19、lette类:类:GDI调色板,包含系统可用的色彩信息,调色板,包含系统可用的色彩信息,是应用程序和彩色输出设备环境是应用程序和彩色输出设备环境(如显示器如显示器)的接口。的接口。CRgn类:类:GDI区域,用于设备环境区域,用于设备环境(通常是窗口通常是窗口)内的内的区域操作,通常和区域操作,通常和CDC类中与裁剪类中与裁剪(clipping)有关的成有关的成员函数配合使用。员函数配合使用。11/27/202227阴影画刷阴影画刷BOOLCbrush:CreateHatchBrush(intnIndex,/指定阴影样式指定阴影样式COLORREFcrColor/指定阴影颜色指定阴影颜色);创
20、建一个黄色的实心画刷创建一个黄色的实心画刷CBrushbrush;brush.CreateHatchBrush(HS_DIAGCROSS,RGB(255,255,0);11/27/202228在在OnDraw函数中添加如下代码,运行结函数中添加如下代码,运行结果如右图。果如右图。11/27/202229使用预定义的画笔、画刷或字体使用预定义的画笔、画刷或字体使用使用CDC类的类的SelectStockObject函数,可以使用预定义函数,可以使用预定义的画笔、画刷或字体的画笔、画刷或字体CGdiObject*SelectStockObject(intnIndex);如如pDC-SelectSt
21、ockObject(GRAY_BRUSH);nIndex的部分可取值如下(完整参数列表可参考的部分可取值如下(完整参数列表可参考MSDN)BLACK_BRUSH:黑色画刷:黑色画刷DKGRAY_BRUSH:深灰色画刷:深灰色画刷GRAY_BRUSH:灰色画刷:灰色画刷HOLLOW_BRUSH:中空画刷,不做填充:中空画刷,不做填充LTGRAY_BRUSH:浅灰色画刷:浅灰色画刷NULL_BRUSH:无画刷,不做填充:无画刷,不做填充WHITE_BRUSH:白色画刷:白色画刷BLACK_PEN:黑色画笔:黑色画笔NULL_PEN:无画笔,不画线:无画笔,不画线WHITE_PEN:白色画笔:白色画笔ANSI_FIXED_FONT:ANSI固定系统字体固定系统字体DEVICE_DEFAULT_FONT:设备缺省字体:设备缺省字体11/27/202230小结小结掌握基本绘图方法掌握基本绘图方法掌握鼠标事件相应方法掌握鼠标事件相应方法掌握绘图工具的使用方法掌握绘图工具的使用方法11/27/202231
限制150内