windows编程技术08GDI编程1-绘图

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

1第8章GDI编程1-绘图GDI(GraphicsDeviceInterface,图形设备接口)是Windows操作系统的传统图形子系统,负责与设备无关的图形绘制,Win32API为应用程序提供了丰富的绘图函数和功能,MFC对它们进行了C++类封装,参见图8-1。Windows应用程序MFCWin32API执行程序用户界面(User)GDI+图形子系统(GDI)设备驱动程序内核(Kernel)图形驱动程序硬件抽象层(HAL)计算机硬件图8-1GDI与Windows操作系统(其中彩色部分为操作系统)传统GDI是随Windows1.0于1985年11月推出的,新式GDI+则是随WindowsXP于2001年10月推出的GDI的改进版,增加了α混色、渐变画刷、样条曲线、矩阵变换、图像处理、持久路径等新功能。随WindowsVista及.NET框架3.0微软于2006年11月又推出了基于DirectX和.NET框架的全新图形子系统WPF(WindowsPresentationFoundation,视窗显示/展现基础),它统一了桌面和浏览器等客户端应用程序的图形界面,采用XAML声明式编程,将用户界面的设计和编程彻底分离开来,是Windows的下一代GUI显示系统。本书从第8章到第11章,将详细讨论如何使用GDI进行传统的Windows图形编程,包括绘图、文字、图像、动画、图标、图元文件和打印等内容。GDI+是建立在GDI之上的,计划在第14和15章中作简单介绍。WPF则是以.NET框架为基础的,准备在第19上和20章中再加以讨论。在MFC应用程序中,绘图一般在视图类的(屏幕/打印机)绘图消息响应函数OnDraw中进行,例如:voidCDrawView::OnDraw(CDC*/*pDC*/){CDrawDoc*pDoc=GetDocument();ASSERT_VALID(pDoc);if(!pDoc)return;2//TODO:在此处为本机数据添加绘制代码}每次需要重绘窗口时(如程序启动、窗口大小改变、全部或部分窗口重现、程序员调用函数RedrawWindow或Invalidate/UpdateWindow),应用程序框架都会调用此CWnd消息响应成员函数(的覆盖)来绘制窗口客户区。在Windows中,绘图一般在框架窗口的客户区(对应于视图类C*View)进行,使用的是封装在MFC的设备上下文(Device-Context,DC)类CDC中的各种绘图函数。在绘图前,一般需先得到客户区大小和CDC对象、设置绘图颜色,然后再根据文档数据或用户操作来绘制各种图形。8.1几何对象的结构和类为了使用绘图函数,应该先了解绘图所用到的几种表示几何对象的结构和类,包括点、大小和矩形,其中常用的是点和矩形。这些结构和类被分别定义在头文件windef.h和afxwin.h中。MFC中的几何对象类都是独立的类(不是CObject的派生类),是对API中对应结构的C++封装,参见图8-2。8.1.1点点(point)在API中的结构为POINT,对应的MFC类为CPoint。1.点结构POINTAPI中的点数据结构POINT用来表示一点的x、y坐标:typedefstructtagPOINT{LONGx;LONGy;}POINT;其中,类型LONG(32位整数)的定义为:typedeflongLONG;2.点类CPointMFC中的点类CPoint为一个没有基类的独立类,封装了POINT结构,有成员变量x和y,其构造函数有5种:图8-2GDI几何对象的结构与类3CPoint();//默认CPoint(intinitX,intinitY);//常用CPoint(POINTinitPt);CPoint(SIZEinitSize);CPoint(LPARAMdwPoint);//低字设为x、高字设为yCPoint类还定义了4个平移和设置的成员函数:voidOffset(intxOffset,intyOffset);voidOffset(POINTpoint);voidOffset(SIZEsize);voidSetPoint(intX,intY);另外,CPoint类还重载了+、-、+=、-=、==、!=等运算符来支持CPoint对象和CPoint、POINT、SIZE对象之间的运算。8.1.2大小大小(size,尺寸)在API中的结构为SIZE,在MFC中的类为CSize。1.大小结构SIZE大小结构SIZE用来表示矩形的宽cx和高cy:typedefstructtagSIZE{LONGcx;LONGcy;}SIZE;2.大小类CSizeMFC中的大小类CSize也为一个没有基类的独立类,封装了SIZE结构,有成员变量cx和cy,其构造函数也有5种:CSize();CSize(intinitCX,intinitCY);CSize(SIZEinitSize);CSize(POINTinitPt);CSize(DWORDdwSize);//低字设为cx、高字设为cyCSizet类也重载了+、-、+=、-=、==、!=等运算符来支持CSize对象和CSize、POINT、SIZE、RECT对象之间的运算。8.1.3矩形矩形(rectangle)在API中的结构为RECT,在MFC中的类为CRect。41.矩形结构RECTAPI中的矩形结构RECT定义了矩形的左上角与右下角的坐标:typedefstructtagRECT{LONGleft;LONGtop;LONGright;LONGbottom;}RECT;2.矩形类CRectMFC中的矩形类CRect也为一个没有基类的独立类,封装了RECT结构,有成员变量left、top、right和bottom,其构造函数有6种:CRect();//默认CRect(intl,intt,intr,intb);//常用CRect(constRECT&srcRect);CRect(LPCRECTlpSrcRect);CRect(POINTpoint,SIZEsize);CRect(POINTtopLeft,POINTbottomRight);CRect类重载了=,+、-,+=、-=,==、!=,&、|,&=、|=等运算符来支持CRect对象和CRect、POINT、SIZE、RECT对象之间的运算。还定义了转换符LPCRECT和LPRECT来自动完成CRect对象到矩形结构和类指针LPCRECT和LPRECT的转换。CRect类中常用的属性和成员函数有:intWidth()const;intHeight()const;CSizeSize()const;CPoint&TopLeft();CPoint&BottomRight();CPointCenterPoint()const;voidSwapLeftRight();BOOLIsRectEmpty()const;BOOLPtInRect(POINTpoint)const;voidSetRect(intx1,inty1,intx2,inty2);voidSetRect(POINTtopLeft,POINTbottomRight);voidOffsetRect(intx,inty);voidMoveToXY(intx,inty);3.判断点是否在矩形中有时需要判断某点(如鼠标位置)是否在某一矩形区域(如控件)中,这可以调用CRect类的PtInRect函数来做:BOOLPtInRect(POINTpoint)const;该函数当点point在其矩形区域内时,返回真。注意,该矩形区域不包括矩形的右边界和底边界。例如:CRectrect(10,10,371,267);5voidCDrawView::OnLButtonUp(UINTnFlags,CPointpoint){//TODO:在此添加消息处理程序代码和/或调用默认值if(rect.PtInRect(point))......CView::OnLButtonUp(nFlags,point);}8.1.4获得客户区大小绘图一般都是在框架窗口的客户区(对应于视图类)进行,而客户区的大小在运行时可由用户动态改变,为了使绘制的图形能随窗口大小而自动改变,需先得到当前客户区大小的数据(宽和高)。获取客户区大小的方法有如下两种:1.OnSize获取客户区大小的第一种方法是通过消息响应函数OnSize中获得。可利用属性窗口的消息页,为视图类添加WM_SIZE消息的响应函数OnSize。该函数会在窗口第一次显示或窗口大小被改变时被系统调用。其输入参数中的cx和cy就是当前客户区的宽和高,可将它们赋值给类变量(如m_iW和m_iH)供绘图时使用。例如:voidCDrawView::OnSize(UINTnType,intcx,intcy){CView::OnSize(nType,cx,cy);//TODO:在此处添加消息处理程序代码m_iW=cx;m_iH=cy;}其中,nType的值为:SIZE_MAXIMIZED(窗口已被最大化)SIZE_MINIMIZED(窗口已被最小化)SIZE_RESTORED(窗口已被改变大小)SIZE_MAXHIDE(其他窗口被最大化)SIZE_MAXSHOW(其他窗口从最大化还原)62.GetClientRect获取客户区大小的第二种方法是调用窗口类的获取客户区矩形成员函数GetClientRect来得到。具体做法是,在绘图前定义一个矩形结构变量rect,然后再调用CWnd类的成员函数GetClientRect来得到当前客户区矩形的数据,该函数的原型为:voidGetClientRect(LPRECTlpRect)const;其中,矩形结构的右(right)与底(bottom)就是客户区的宽与高(其左left与顶top都为0)。例如:RECTrect;GetClientRect(&rect);intiW=rect.right,iH=rect.bottom;8.2绘图环境DC在Windows中,绘图包括绘制图形、显示位图和输出文字,它们都需要使用绘图环境DC(Device-Context,设备上下文)。MFC将DC结构和所有的绘图函数、绘图对象的访问函数、绘图模式与参数的设置函数都封装到了CDC类中。8.2.1DC结构DC是Windows为设备无关的图形绘制而定义的一种数据结构,包含了一组图形对象及关联属性和若干影响输出的图形模式和绘图参数。所有的GDI绘图操作,都是采用DC中的当前图形对象作为绘图工具,并且都是在DC中的当前图形模式下使用当前的绘图参数进行的。1.图形对象Windows的图形对象(graphicobject)包括画线状图的笔、绘制和填充面状图的刷、用于复制和滚动部分屏幕的位图、定义可用颜色的调色板、用于裁剪和其他操作的区域、用于绘制和画图操作的路径、及用于输出文字的字体,参见表8-1。图像对象所对应的MFC类将在8.3.6中介绍,其中笔和刷在8.3.3和8.3.4中介绍,字体在9.2中介绍。表8-1图形对象及DC的默认值7图形对象关联属性DC默认值笔风格、宽度、颜色实心、单像素、黑色刷风格、颜色、图案、原点实心、白色、单色、(0,0)位图大小(字节)、尺寸(像素)、颜色格式、压缩方式等无调色板颜色与大小(或颜色数)20种标准系统色区域定位与尺寸窗口矩形路径形状无字体字体名、宽、高、粗细、字符集等system(宋体)、7、16、700(粗体)、GB2312_CHARSET2.图形模式图形模式(graphicsmode)用于确定颜色如何混合、输出在何处出现、输出如何缩放等,参见表8-2。表8-2图形模式及DC的默认值图形模式描述DC默认值介绍章节映射定义图形输出如何从逻辑(或世界)空间映射到窗口、屏幕或打印机纸,即坐标体系文本(MM_TEXT),即设备坐标(单位为像素、x向右、y向下)8.4.1绘图对笔、刷、位图和文本操作,定义前景色如何与已存在的窗口或屏幕颜色混合覆盖(R2_COP

1 / 42
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功