下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第7章,图形程序的编程基础,Windows GDI的基本概念和原理,Windows GDI及图形设备接口,是Windows系统的重要组成部分,是Windows系统实现图形界面的基础。 设备无关性是如何实现的呢?从过程来说,在Windows 2000中,有以动态链接库GDI32.DLL,主要负责图形环境下图形的输出。 GDI 绘图函数 从程序员的角度看,GDI提供了几百个函数调用和一些相关的结构、宏和数据类型,便于程序员对显示器、打印机等硬件设备进行图输出 设备描述表;程序有绘图请求时被创建并得以维持,他负责为程序准备相关的信息,起到为程序屏蔽具体物理设备的作用。当程序希望获得具体物理设备信息时
2、,可以通过一些GDI函数来获得。,设备描述表 p104,什么是设备描述表(device context,DC) 在Windows环境下,所有输出都要通过GDI函数。 在Windows系统中为每一个设备建立一个数据结构,这个结构记录了设备输出时的详细要求,如文字,画刷等对象,这个数据结构称为设备描述表,即DC。这种把设备抽象成为DC,是实现设备无关性的关键,也就是只要对DC作输出操作,Windows自动把DC中的内容转换和输出到实际的输出设备上(屏幕或打印机等) 通过BeginPaint函数可获得DC,对应的EndPaint函数可释放DC 通过GetDC函数可获得DC,对应的ReleaseDC函
3、数可释放DC,7.1.1 GDI函数及其分类,取得和释放设备描述表代号的函数 GetDC, ReleaseDC; BeginPaint,EndPaint; 取得字体尺寸信息的函数 GetTextMetrics 绘图函数 TextOut 设定和取得设备描述表中有关属性的函数 SetTextColor,SetTextAlign, 使用GDI对象的函数,GDI绘图函数,GDI函数简介 1 获取和释放设备描述表的函数 GetDC ReleaseDC BeginPaint EndPaint 2 获得设备描述表信息的函数 GetTextMetric GetDeviceCaps 3 使用GDI对象的函数 六
4、种可创建的GDI对象: 画笔、画刷、位图、字体、区域、调色板 4 设置和获取设备描述表属性的函数 映射方式,背景色,前景色,绘图模式 5 GDI绘图函数,7.1.2 GDI绘制的基本图形,直线和曲线 直线、矩形、椭圆、弧、Bezier曲线,折线 填入区域 当使用了封闭的曲线绘图后,GDI将用画刷填充该区域 点阵图 GDI支持“与设备有关位图”和“与设备无关位图” GDI提供两种位图之间的转换 设备描述表中则采用“与设备有关的位图”,7.1.3 GDI提供的其他功能,映射模式和变换 Metafile(它是GDI命令的集合,主要用于通过剪贴板传输向量图形) 绘图区域 路径 裁剪 调色盘(板) 打印
5、,7.2.2 取得设备描述表中信息的方法,iValue = GetDeviceCaps(hdc,iIndex); 其中iIndex为预先定义的整数常量;iValue为返回的对应的数值信息,/* Device Parameters for GetDeviceCaps() */ #define DRIVERVERSION 0 /* Device driver version */ #define TECHNOLOGY 2 /* Device classification */ #define HORZSIZE 4 /* Horizontal size in millimeters */ #defi
6、ne VERTSIZE 6 /* Vertical size in millimeters */ #define HORZRES 8 /* Horizontal width in pixels */ #define VERTRES 10 /* Vertical height in pixels */ #define BITSPIXEL 12 /* Number of bits per pixel */ #define PLANES 14 /* Number of planes */ #define NUMBRUSHES 16 /* Number of brushes the device ha
7、s */ #define NUMPENS 18 /* Number of pens the device has */ #define NUMMARKERS 20 /* Number of markers the device has */,7.2.3 关于CS_OWNDC设备描述表,未使用CS_OWNDC属性,case WM_PAINT hdc = BeginPaint(hwnd,设备描述表被释放,每次重新获得设备描述表,重新进行初始化设定,7.2.3 关于CS_OWNDC设备描述表,使用CS_OWNDC属性(不提倡) 在窗口类的使用中加入CS_OWNDC wndclass.style =
8、CS_HREDRAW|CS_OWNDC; 在窗口创建后的WM_CREATE中加入 case WM_CREATE: hdc = GetDC(hwnd); ReleaseDC(hwnd,hdc); return;,static HDC hdc; 初始化一次,以后hdc 将可以一直使用,直到该窗口被撤销,7.2.7 色彩,在图形界面环境中,色彩是很重要的一部分内容。有了色彩,应用程序才能更加生动地表达自己的设计思想,更容易与用户交流,用事业是应用程序更加直观。 色度学理论认为,任何颜色都可以由红、绿、蓝三种基本颜色按不同的比例混合得到,例如:黄色可以由红、绿各一半混合而成。因此,红、绿、蓝被称为三原
9、色,简称RGB三原色。 颜色的表示和设置 Windows采用32位无符号长整数表示色彩,COLORREF值, COLORREF RGB(BYTE byRed,BYTE byGreen,BYTE byBlue); 另外,有三个宏可以获取一个COLORREF值中包含的红、绿、蓝分量值。 BYTE GetRValue(DWORD rgb); BYTE GetGValue(DWORD rgb); BYPE GetBValue(DWORD rgb);,7.3 画线函数和画笔,7.3.1 处理像素的函数,(1) SetPixel 此函数用于设置指定点的颜色信息 COLORREF SetPixel(HDC
10、hdc,int nXPos,int nYPos,COLORREF crColor); (2) GetPixel 此函数用于获得指定点的颜色信息 COLORREF GetPixel(HDC hdc,int nXPos,int nYPos);,7.3 画线函数和画笔,7.3.2 画线的函数,LineTo 此函数使用设备描述表中的画笔来画出一条线 BOOL LineTo(HDC hdc, int nXEnd, int nYEnd ); MoveToEx 此函数用于移动画笔到指定的点 BOOL MoveToEx(HDC hdc, int X, int Y, LPPOINT lpPoint ); Pol
11、yline 此函数用于画折线 Polyline(HDC hdc, LPPOINT Array, int numOfPoint); PolylineTo 此函数用于画折线,并改变“当前位置” Polyline(HDC hdc, LPPOINT Array, int numOfPoint);,把(X,Y)设定为设备描述表的“当前位置”,把(nXEnd,nYEnd)设定为设备描述表的“当前位置”,返回原设备描述表的“当前位置”放在lpPoint中,把Array中的最后一个点设定为设备描述表的“当前位置”,7.3.3 画正弦曲线程序SINEWAVE,这个程序有一个含有1000个POINT结构(点对)的
12、数组。随着for循环从0增加到999,结构的x成员设定为从0递增到数组cxClient。结构的y成员设定为一个周期的正弦曲线值,并被放大以填满客户区。整个区县的绘制仅仅使用了一个Polyline调用。,打开编辑程序,7.3.5 像素偏差问题(自学),绘制曲线,(1) Arc 此函数以(0,0)为基准点绘制椭圆弧线。在默认情况下,椭圆弧按逆时针方向绘制。 BOOL Arc(HDC hdc,int upX,int upY,int lowX,int lowY, int startX,int startY,int endX,int endY);,lowX,lowY,矩形中心,startX,startY
13、,已画的圆弧,endX,endY,绘画方向,upX,upY,绘制填充区域Rectangle,(1) Rectangle 从左上角(upX,upY)向右下角(lowX,lowY)绘制矩形.用当前笔画显示矩形,用当前画刷自动填充矩形. BOOL Rectangle(HDC hdc,int upX,intY,int lowX,int lowY);,绘制填充区域Ellipse,(2) Ellipse 通过指定椭圆的边界矩形来定义椭圆. BOOL Ellipse(HDC hdc,int upX,int upY,int lowX,int lowY);,绘制填充区域Pie,(3) Pie 扇形图是一个包含弧
14、和两条线的对象,这两条线分别以弧的端点和中心点为端点 BOOL Pie(HDC hdc,int upX,int upY,int lowX,int lowY, int startX,int startY,int endX,int endY);,lowX,lowY,矩形中心,startX,startY,已画的圆弧,endX,endY,绘画方向,upX,upY,绘制填充区域RoundRect,(5) RoundRect 绘制圆角矩形函数原型 BOOL RoundRect(HDC hdc,int upX,int upY,int lowX,int lowY, int curveX,int curveY)
15、;,7.3.6 LINEDEMO 画图程序,程序7-3LINEDEMO画一个矩形、一个椭圆、一个圆角矩形和两条线段。因为在椭圆后面的线遮住了,所以程序表明封闭区域的函数实际上已对这些区域进行了填入。,打开编辑程序,颜色、画笔和画刷,画笔和画刷是应用程序进行图形输出时最常用的工具,应用程序能够选择Windows系统备用的画笔和画刷进行绘图,也能够创建自定义的画笔和画刷,并将他们选入设备描述表中,按照自定义的风格进行图形绘制。 色度学理论认为,任何颜色都可以由红、绿、蓝三种基本颜色按不同的比例混合得到,例如:黄色可以由红、绿各一半混合而成。因此,红、绿、蓝被称为三原色,简称RGB三原色。,7.3。
16、 设备描述表的结构 p104,hBrush,hFont,hPen,hRgn,hBitmap,hPalette,hDC,Bitmap对象结构,Palette对象结构,各种驱动,.,画图坐标位置,7.3.7 关于画笔,逻辑画笔是一种GDI对象,有线宽、线形、颜色等属性 hPen = GetStockObject(WHITE_PEN); hOldPen = SelectObject(hdc,hPen); 在WM_DESTROY消息期间,应用程序即将结束,程序不再需要以创建的逻辑画笔,所以应该将这些画笔删除以释放其占用的系统资源。 DeleteObject(hPen); SelectObject(hd
17、c,hOldPen); 画笔程序实例,PenCreating.cpp,GetStockObject参数,WHITE_BRUSH 0 LTGRAY_BRUSH 1 GRAY_BRUSH 2 DKGRAY_BRUSH 3 BLACK_BRUSH 4 NULL_BRUSH 5 HOLLOW_BRUSH NULL_BRUSH,创建画笔CreatePen函数,HPEN CreatePen(int fnPenStyle,int nWidth, COLORREF crColor); fnPenStyle:确定画笔的线型, Style可以是如下一些样式: PS_DASH 虚线 PS_DASHDOT 点划线 P
18、S_DASHDOTDOT 双点划线 PS_DOT 点线 PS_SOLID 实线,创建画笔CreatePenIndirect函数,HPEN CreatePenIndirect(CONST LOGPEN *lplgpn); typedef struct tagLOGPEN UINT lopnStyle; POINT lopnWidth; COLORREF lopnColor; LOGPEN, *PLOGPEN;,创建画笔ExtCreatePen函数,此函数扩展了函数CreatePen,可以创建Cosmetic和Geometric两种类型的画笔。 HPEN ExtCreatePen(DWORD dw
19、PenStyle, DWORD dwWidth,CONST LOGBRUSH *lplb,DWORD dwStyleCount,CONST DWORD *lpStyle);,7.3.8 背景模式、背景颜色及其处理,点式画笔和虚线画笔的空隙的着色问题 空隙的颜色取决于背景的颜色,即取决于设备描述表的两个属性-背景模式(BkMode)和背景颜色(BkColor)。内定的背景模式为OPAQUE(不透明),在这种方式下,Windows使用背景颜色来填入空隙,内定的背景色为白色。 SetBkColor(hdc, crColor); /设置背景色也就改变了空隙颜色 如果将背景模是内定为TRANSPAREN
20、T(透明),那么背景色就不能再设置, SetBkMode(hdc, TRANSPARENT); /将阻止Windows应用程序填入空隙。,7.4 画刷相关函数和结构,CreateSolidBrush 此函数用于创建一个solid画刷(solid画刷使用指定的颜色定义的纯色画刷)。创建这种类型的画刷很容易 GetStockObject 此函数用于创建一个stock画刷,stock画刷是由GDI提供的备用画刷,共有7种。 CreateHatchBrush 此函数用于创建一个hatch画刷,hatch画刷是以一定的图案进行填充的位图,图形不在以纯色填充,而是一些纹理图案。 CreatePattern
21、Brush 该函数用于创建基于GDI位图的pattern画刷。pattern画刷是一种自定义风格的画刷,用户根据程序定义的GDI位图或者DIB(设备无关位图)能创建出基于位图的画刷。使用这种画刷,应用程序可以获得更加美观的填充方案。 CreateBurshIndirect 此函数使用定义的结构间接创建画刷。,GetStockObject,HBRUSH GetStockObject(int fnObject); 此函数用于创建一个stock画刷,stock画刷是由GDI提供的备用画刷,共有7种。 #define WHITE_BRUSH 0 #define LTGRAY_BRUSH 1 #defi
22、ne GRAY_BRUSH 2 #define DKGRAY_BRUSH 3 #define BLACK_BRUSH 4 #define NULL_BRUSH 5 #define HOLLOW_BRUSH NULL_BRUSH,CreateSolidBrush,此函数用于创建一个solid画刷(solid画刷使用指定的颜色定义的纯色画刷)。创建这种类型的画刷很容易 HBRUSH CreateSolidBrush(COLORREF crColor);,CreateBurshIndirect,此函数使用定义的结构间接创建画刷。 HBRUSH CreateBrushIndirect( CONST L
23、OGBRUSH *lplb);,CreateHatchBrush,此函数用于创建一个hatch画刷,hatch画刷是以一定的图案进行填充的位图,图形不在以纯色填充,而是一些纹理图案。 HBRUSH CreateHatchBrush( int fnStyle, COLORREF clrref);,CreatePatternBrush,该函数用于创建基于GDI位图的pattern画刷。pattern画刷是一种自定义风格的画刷,用户根据程序定义的GDI位图或者DIB(设备无关位图)能创建出基于位图的画刷。使用这种画刷,应用程序可以获得更加美观的填充方案。 HBRUSH CreatePatternBr
24、ush(HBITMAP hbmp),画刷程序实例,BrushCreating.cpp,我想画,我想画一艘船,船上有桅杆,桅杆上有一面旗子,船的形状由直角坐标系的数学模型构成的,我画了一艘船,我按数学模型在屏幕上用绘图函数绘制了出来,我纳闷,?,?,?,?,?,船倒过来了. , 在一个角落上., 只看到了船的一部分., 太小了.,我发挥我的数学才能,我修改了所有数学模型的坐标数据。 我累死了. 这件工作足足花去了我2个星期. 而且还不能保证完全正确.,但我终于画出来了。,我想应该有更好的方法,GDI映射模式 为我解决了问题,7.5 GDI映射方式,坐标系统 几种映射模式的比较 窗口和视口 映射模
25、式程序实例 MapMode,坐标系统,在Windows应用程序中,有两种坐标系统:设备坐标和逻辑坐标。 设备坐标系统直接与硬件设备的显示相关,以像素为度量单位。水平轴(即x轴)的正方向从左向右,垂直轴(即y轴)的正方向从上向下,并且整个坐标轴的单位和方向固定不变。 逻辑坐标系统与设备描述表的属性映射模式相关,他是一种允许自定义的坐标系统,坐标轴方向、单位和原点位置都可以重新定义。 逻辑坐标系统下绘出的图形必须映射到设备坐标系统下,才能在屏幕上显示出来。,几种映射模式的比较,int SetMapMode(HDC hdc,int mode); 说明:mode指定新的映射模式,说明:mode指定新的
26、映射模式,可以由如下一些情况,视口和窗口,视口和窗口是WindowsGDI种两个很重要的概念,从逻辑坐标映射为设备坐标实际上就是从视口和窗口的映射。 视口是基于设备坐标的,他以像素为单位,指定视口的新的水平尺寸和垂直尺寸,即物理上的Xextent点相当于逻辑上1点,起到放大图形的效果。 视口有视口原点和视口范围两个基本属性: 窗口是以逻辑单位为单位指定窗口的新的水平尺寸和垂直尺寸,即逻辑上的Xextent点相当于物理上1点,起到缩小图形的效果。,视口函数,BOOL SetViewportExtEx(HDC hdc, int Xextent, int Yextent, LPSIZE size);
27、 调用后,原来物理单位的尺寸则被存放到size所指定的结构变量中.,窗口函数,BOOL SetWindowExtEx(HDC hdc, int Xextent, int Yextent, LPSIZE size);,视口与窗口函数组合,SetMapMode(hdc, MM_ANISOTROPIC); SetViewportExtEx(hdc,3,3,MoveToEx(hdc,0,0,NULL); LineTo(hdc,100,100); SelectObject(hdc,hRedpen); MoveToEx(hdc,0,100,NULL); LineTo(hdc,100,0);,视口与窗口函数
28、组合,SetMapMode(hdc, MM_ANISOTROPIC); SetViewportExtEx(hdc,3,3,MoveToEx(hdc,0,0,NULL); LineTo(hdc,100,100); SelectObject(hdc,hRedpen); MoveToEx(hdc,0,100,NULL); LineTo(hdc,100,0);,BOOL SetViewportOrgEx(HDC hdc, int X, int Y, LPPOINT OldOrg); 说明:X,Y是以像素为单位的新的视区原点,调用后,原来的视区原点则被存放在OldOrg指向的POINT结构中,设置视区原
29、点,BOOL SetViewportOrgEx(HDC hdc, int X, int Y, LPPOINT OldOrg); 说明:X,Y是以像素为单位的新的视区原点,调用后,原来的视区原点则被存放在OldOrg指向的POINT结构中,(X=50,Y=50),MapMode,7.6 位图(补充),位图是Windows应用程序中存储图像信息的方法之一。用于表示来自真实世界的复杂图像。从结构上来说,位图是一个二维像素位数组,通常按照从左向右、自顶向下的顺序记录各像素位的信息。 7.6.1 设备相关位图DDB DDB位图程序实例screensnap.c 7.6.5 设备无关位图DIB DIB位图程
30、序实例DIBtoDDB.c,7.6.1 创建DDB位图,(1) CreateCompatibleBitmap 此函数用于创建彩色的位图(包括真彩色)。他实际创建了与指定设备或设备描述表兼容的位图,该位图有与指定设备一样的颜色结构。 HBITMAP CreateCompatibleBitmap(HDC hdc,int nWidth, int nHeight);,7.6.2 内存设备描述表,内存设备描述表位于内存中,并不是真正的图形输出设备,程序也不能直接显示存储在其内的信息。同时,创建的GDI位图对象仅能被选入内存设备描述表中。由于这些特性,在位图的输出过程中,内存设备描述表发挥了巨大的作用,可
31、是实现许多特殊的位图显示效果。例如,程序可以在选入内存设备描述表种的位图中绘图,然后“拷贝”到显示设备描述表中进行显示;通过创建多个内存设备描述表,可以对选入其内的位图进行像素位的光栅操作,以实现某些特殊的显示效果。 HDC hdcMem=CreateCompatibleDC(hDC); HBITMAP hmemBM=CreateCompatibleBitmap(hDC); SelectObject(hdcMem,hmemBM);,7.6.2 内存设备描述表,HDC hMemDC=CreateCompatibleDC(hDC);,HBITMAP hmemBM=CreateCompatibleB
32、itmap(hDC),SelectObject(hMemDC,hmemBM);,Font对象结构,Rgn对象结构,Palette对象结构,hBrush,hFont,hPen,hRgn,hBitmap,hPalette,hDC,Brush对象结构,各种驱动,.,画图坐标位置,Pen对象结构,Bitmap对象结构 (点阵图形),7.6.3 DDB位图操作函数BitBlt,HDC hMemDC=CreateCompatibleDC(hDC);,HBITMAP hmemBM=CreateCompatibleBitmap(hDC),SelectObject(hMemDC,hmemBM);,Font对象结
33、构,Rgn对象结构,Palette对象结构,hBrush,hFont,hPen,hRgn,hBitmap,hPalette,hDC,Brush对象结构,各种驱动,.,画图坐标位置,Pen对象结构,Bitmap对象结构 (点阵图形),BitBlt(hDC, X0, Y0, Width, Height, hMemDC, X1, Y1, SRCCOPY);,7.6.3 DDB位图操作函数BitBlt,BOOL BitBlt(HDC hdcDest, int nXOrignDest, int nYOrignDest,int nWidth, int nHeight, HDC hdcSrc, int nX
34、OrignSrc, int nYOrignSrc, DWORD dwRop); /* Ternary raster operations */ #define SRCCOPY (DWORD)0 x00CC0020 /* dest = source */ #define SRCPAINT (DWORD)0 x00EE0086 /* dest = source OR dest */ #define SRCAND (DWORD)0 x008800C6 /* dest = source AND dest */ #define SRCINVERT (DWORD)0 x00660046 /* dest = source XOR dest */ #define SRCERASE (DWORD)0 x00440328 /* dest = source AND (NOT dest ) */ #define NOTSRCCOPY (DWORD)0 x00330008 /* dest = (NOT source) */ #define NOTSRCERASE (DWORD)0 x001100A6 /* dest
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 人机工程学迭代对便携行李车用户留存率及项目现金流的传导机制
- 二层蒸锅模块化设计在餐饮空间坪效革命中的资产配置策略重构
- 三折结构机械疲劳寿命与消费者复购周期量化模型
- AI肤质检测赋能E光精准治疗对单店盈利模型的重构效应
- 2026年满洲里俄语职业学院高职单招笔试英语试题库含答案解析3套试卷
- 2026年湖南艺术职业学院高职单招笔试语文试题库含答案解析2套试卷
- 2026年湖南安全技术职业学院高职单招笔试数学试题库含答案解析3套试卷
- 2026年湖南中医药高等专科学校高职单招笔试语文试题库含答案解析3套试卷
- 2026年海南科技职业学院高职单招笔试职业适应性测验试题库含答案解析3套试卷
- 2026年浙江经济职业技术学院高职单招笔试物理试题库含答案解析2套试卷
- 蒋诗萌小品《谁杀死了周日》台词完整版
- DB11∕T 428-2018 种羊场舍区、场区、缓冲区环境质量要求
- 50吨门式起重机拆除施工方案样本
- 2024年度2024行政复议法培训
- 食品毒理学-第二章-毒理学基本概念
- 智能交通概论全套教学课件
- YY/T 1833.4-2023人工智能医疗器械质量要求和评价第4部分:可追溯性
- 中药的贮藏与养护技术-中药饮片保管与养护
- 双液系的气液平衡相图课件
- 中考物理学科双向细目表
- 幼儿园多媒体PPT课件制作PPT完整全套教学课件
评论
0/150
提交评论