资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,第6章 图形程序的编程基础,概论,GDI(Graphics Device Interface),Windows系统的一种软件子系统,它按照GDI函数来工作,负责在屏幕显示器和打印机上显示图形。,32位GDI就是GDI32.DLL动态链结库,可以把它理解成GDI函数的解释器并按照解释调用相应的设备驱动程序。,不同的设备有不同的设备驱动程序,这就实现了与设备无关的图形输出,GDI在应用程序和不同输出设备之间起着隔离作用,应用程序只要考虑GDI函数不必考虑设备,是实现设备无关性输出的关键措施。,GDI函数及其分类,取得和释放设备描述表代号的函数,如前所述:BeginPaint、GetDC、GetWindowDC,取得字体尺寸信息的函数:GetTextMetrics。,绘图函数:LineTo(画直线)等,设定和取得设备描述表中有关属性的函数,SetTextColor、SetTextAlign等,使用GDI对象的函数,逻辑笔、画刷、字体等对象,使用时加载到设备描述表中,GDI绘制的基本图形,直线和曲线,支持直线、矩形、椭圆、圆弧,填入区域,对封闭区域可以使用当前GDI画刷对象进行填图,点阵图,常用于图像的显示:bmp文件,文本,图形程序设计的其他问题,映射模式及其变换,Metafile(元文件),metafile以图形绘制命令描述图像,因此可以对图像进行缩放而不会失真,绘图区域,路径,裁剪,调色盘,打印,设备描述表,取得设备描述表代号的方法,GetWindowDC:获取整个窗口的设备描述表代号,在WM_NCPAINT消息分支中响应。,CreateDC:取得整个屏幕的设备描述表代号,常用于打印机。,CreateIC:获取设备描述表的一些信息,但不能用此绘图。,取得设备描述表中信息的方法,GetDeviceCaps,确定设备处理不同类型图形的能力。,程序,保存设备描述表,原因,希望对改变后的设备描述表属性在下次使用仍然有效。,解决,在注册窗口时加入CS_OWNDC属性,只需初始化一次属性,一般在WM_CREATE消息响应中设置。,CS_OWNDC只影响GetDC和BeginPaint获得的设备描述表,SaveDC,RestoreDC,设备描述表的构成,由19项构成,如果不对其属性改变,使用的是默认值,如上一章例子中使用的TextOut函数,典型:,Tex tColor,Font,Current Position,解析度,概念,每度量单位内的像素数目,打印机经常用“每英寸的点数(DPI)”表示,显示器以水平和垂直的总像素来表示的。,如果设备的水平解析度与垂直解析度相等,称为正方形像素。,可以使用SM_CXSCREEN和SM_CYSCREEN参数得到像素尺寸,色彩,色彩数,每个像素的色彩数由表达颜色的二进制位数决定,最简单的黑白显示器由1位表达,在大多数GDI函数调用中,使用COLORREF值,该值是一个32位的无正负号长整数,但只用了24位(3个8位,R、G、B3基色各占8位),通常利用宏RGB构建,画线函数与画笔,处理像素的函数,Windows GDI尽管包含了SetPixel和GetPixel函数,但很少使用它们。,SetPixel(hdc,x,y,crColor);/在(x,y)坐标处设置像素颜色crColor,GetPixel函数返回指定座标处的像素颜色:,crColor=GetPixel(hdc,x,y);,画线函数与画笔,画线函数,画线函数的作用是画出图形的轮廓线。,Windows支持画直线、椭圆线等,LineTo 画直线。,Polyline和PolylineTo 画一系列相连的直线。,PolyPolyline 画多组相连的线。,Arc 画椭圆线。,PolyBezier和PolyBezierTo 画贝塞尔曲线。,正弦曲线程序SINEWAVE,画线函数与画笔,画线函数,与画线函数相关的设备描述表的属性:,当前画笔的地址,、画笔、背景方式、背景色和绘图模式,MoveToEx函数改变(确定)画笔当前地址,用POINT结构体表达地址信息,可利用GetCurrentPositionEx函数获得画笔当前地址。,图形函数,Rectangle画矩形,Pie 画部分椭圆,呈扇形,Chord画部分椭圆,呈弓形,画线函数与画笔,图形函数,画矩形Rectangle(hdc,xLeft,yTop,xRight,yBottom);,画线函数与画笔,图形函数,画椭圆Ellipse(hdc,xLeft,yTop,xRight,yBottom);(xLeft,yTop),(xRight,yBottom)构成的虚线称为椭圆的外接矩形,画线函数与画笔,图形函数,画圆角矩形RoundRect(hdc,xLeft,yTop,xRight,yBottom,xCornerEllipse,yCornerEllipse),如果xCornerEllipse等於xLeft与xRight的差,且yCornerEllipse等於yTop与yBottom的差,那么RoundRect函数将画出一个椭圆,这个椭园是由四个园角所组成。,画线函数与画笔,图形函数,Arc 画椭圆线,Pie 画部分椭圆,呈扇形(封闭),Chord画部分椭圆,呈弓形(封闭),参数:(hdc,xLeft,yTop,xRight,yBottom,xStart,yStart,xEnd,yEnd),画线函数与画笔,画笔,通常利用设备描述表中的默认画笔进行画线,也可以把预先设计好的画笔放入设备描述表中,然后用其画线。,Windows提供三种画笔:BLACK_PEN,WHITE_PEN,NULL_PEN,获取系统画笔:GetStockObject(WHITE_PEN),设置设备描述表画笔:SelectObject(hdc,hPen);,画线函数与画笔,画笔,画笔的建立,hPen=CreatePen(iPenStyle,iWidth,crColor),CreatePenIndirect(&logpen),hPen=GetObject(hPen,sizeof(LOGPEN),(LPVOID)&logpen,iPenStyle:PS_SOLID PS_DASH PS_DOT PS_DASHDOT PS_NULL PS_INSIDEFRAME,PS_INSIDEFRAME:与填入区域的函数一起使用时,该样式可以保证画出的线条在边界框之内。,画线函数与画笔,画笔,画笔的删除,在WM_CREATE消息期间建立,则在WM_DESTROY消息期间删除:DeleteObject,在WM_PAINT消息期间建立的画笔,一定要在EndPaint前删除,注意:不要删除设备描述表中当前选择用的画笔,画线函数与画笔,背景模式,OPAQUE(不透明):windows使用背景颜色来填入空隙。,TRANSPARENT(透明):windows不使用背景颜色来填入空隙。,通过SetBkMode改变,背景颜色,通过SetBkColor改变,画线函数与画笔,“位布尔运算”与画线模式,当Windows使用画笔来画线时,它实际上执行的是画笔像素与目标地址处原有像素之间的某种“位布尔运算”。,Windows定义了16中运算模式,亦即画线模式,如R2_COPYPEN,windows只是将画笔像素复制到目标像素。,通过SetROP2(hdc,iDrawMode)改变运算模式,典型:R2_COPYPEN、R2_BLACK、R2_NOP,画图,概念,与画线函数的区别,不仅要画边界框,还要画出区域中填入颜色,图形的填入画刷,默认情况使用白色画刷,windows定义了6种画刷,修改画刷,hBrush=GetStockObject(GRAY_BRUSH),SelectObject(hdc,hBrush),注:无边框或者无填充的图形,画图,画刷的建立,CreateSolidBrush(crColor),CreateHatchBrush(iHatchStyle,crColor),iHatchStyle:HS_HORIZONTAL。,画刷的选择和删除,SelectObject(hdc,hBrush),DeleteObject(hBrush),GDI映射方式,概念,为便于用户使用,windows提供了8种设备输出坐标表达方式,如:像素、毫米、英寸等,也就是GDI函数中使用的逻辑单位。,Windows中一切设备都用统一的单位:像素,因此需要将逻辑单位转换到设备单位,即为映射方式,MM_TEXT,MM_LOENGLISH,MM_HIMETRIC。,SetMapMode(hdc,iMapMode),GDI映射方式,设备坐标和逻辑坐标,Windows中,一切设备都用统一的坐标,此坐标称为设备坐标。,所有设备坐标系都以像素为单位,水平轴上的值从左到右递增,垂直轴上的值从上到下递增。,Windows对所有消息,对所有非GDI函数,甚至一些GDI函数,永远使用设备坐标。,GDI映射方式,设备坐标和逻辑坐标,设备坐标分类,屏幕坐标,屏幕的左上角为(0,0),如CreateDC所获得的设备代号,使用的就是屏幕坐标,全窗口坐标 以程序建立的整个窗口为基准,客户区坐标 最常用的“客户区坐标”,(0,0)是客户区的左上角。,视口和窗口,视口是设备坐标表示的客户区,窗口是逻辑坐标表示的程序显示区,讨论,映射模式、设备坐标、逻辑坐标的概念以及相互之间的关系,
展开阅读全文