




已阅读5页,还剩8页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
教 案 用 纸第四章 图 形 基 础一 概述 图形设备接口(GDI:Graphics Device Interface)是Windows的子系统,它负责在视频显示器和打印机上显示图形。二 GDI的结构 GDI原理Window 98和Windows NT中的图形主要由GDI32.DLL动态链接库输出的函数来处理。在Window 98中,这个GDI32.DLL实际是利用16位GDI.EXE动态链接库来执行许多函数。在Windows NT中,GDI.EXE只用于16位的程序。这些动态链接库为用户安装的视频显示器和任何打印机调用设备驱动程序中的例程。视频驱动程序访问视频显示器的硬件,打印机驱动程序将GDI命令转换为各种打印机能够理解的代码或命令。GDI的主要目的之一是支持与设备无关的图形。GDI是图形设备硬件之间的一种高层接口。图形输出设备分为光栅设备和矢量设备两大类。 GDI函数分类 获取(或创建)和释放(或清除)DC的函数;如,GetDC和ReleaseDC函数等 获取有关DC信息的函数;如,GetTextMetrics函数来获取有关DC中当前所选字体的尺寸信息。 绘图函数;如,TextOut等; 设置和获取DC参数的函数;DC的“属性”决定有关绘图函数如何工作的细节。如,SetTextColor 使用GDI对象的函数;如,Brush,Pen和Bitmap等,用SelectObject函数来选择。 GDI图元在屏幕或打印机上显示的图形类型本身可以被分为几类,通常被称为“图元”,他们是: 直线和曲线线条是所有矢量图形绘制系统的基础。GDI支持直线、矩形、椭圆、弧,以及贝塞尔曲线。所有更复杂的曲线可由折线代替。 填充区域当一系列直线或者曲线封闭了一个区域时,该区域可以使用当前GDI画刷对象进行填充。这个画刷可以是实心色彩、图案,也可以是在区域内垂直或者水平重复的位图图像。 位图位图是位的矩形数组,这些位对应于显示设备上的像素,它们是光栅图形的基础工具。位图通常用于在视频显示器或者打印机上显示复杂图像。位图还可以用于显示必须很快绘制的小图像,诸如图标、鼠标光标等。GDI支持两种类型的位图:老的“设备有关”位图,是GDI对象;新的“设备无关”位图,可以存储在磁盘文件中。 文本文本通常不仅是所有的计算机图形系统中最复杂的部分,而且也是最重要的部分。Windows 98不仅支持TrueType字体,而且继续支持旧时的基于位图的字体。 其他方面 映射模式和变换虽然默认时以像素为单位进行绘图,但是并非局限于此。GDI映射模式允许用户以英寸、mm或者任何用户想使用的单位来绘图,但Windows 98不支持坐标变换。 元文件元文件是以二进制形式存储的GDI命令的集合。元文件主要用于通过剪贴板传输矢量图形表示。 区域 区域是形状任意的复杂区,通常定义为较简单区域的布尔组合。在GDI内部,区域除了存储为最初用来定义区域的线条组合以外,还以一系列扫描线的形式存储。用户可以将区域用于绘制轮廓、填充和剪裁。 路径路径是GDI内部存储的直线和曲线的集合。路径可以用于绘图、填充和剪裁,还可以转换为区域。 剪裁绘图可以限制在客户区的某一部分中。剪裁区域可以是矩形或非矩形,剪裁通常是通过区域或者路径来定义的。 调色板定制调色板通常限于显示256色的显示器。Windows仅保留这些色彩之中的20种供系统使用,用户可以改变其他236种色彩,以准确显示按位图形式存储的真实图像。 打印三 设备描述表 获取DC句柄方法一:HDC hdc;PAINTSTRUCT ps;hdc=BeginPaint(hwnd,&ps);EndPaint(hwnd,&ps);方法二: hdc=GetDC(hwnd);ReleaseDC(hwnd,hdc);方法三:hdc=GetWindowDC(hwnd);ReleaseDC(hwnd,hdc);方法四:hdc=CreateDC(TEXT(“DISPLAY”),NULL,NULL,NULL);通过方法四可以获取整个屏幕的DC句柄。特例一:有时用户只是需要获取关于DC的一些信息而并不进行任何绘画,这时,可以使用CreateIC来获取一个“信息描述表”的句柄,其参数与CreateDC函数相同,如:hdc=CreateDC(TEXT(“DISPLAY”),NULL,NULL,NULL); 获取DC信息GetDeviceCaps函数:int GetDeviceCaps( HDC hdc, / handle to the device context int nIndex / index of capability to query);通过该函数可以获取指定设备的信息。如:iValue=GetDeviceCaps(hdc,HORZRES);可得到设备的宽度(单位为像素)。四 画点和线在理论上,只要提供SetPixel和GetPixel函数,就可以使用图形设备驱动程序绘制一切东西了。 写像素COLORREF SetPixel( HDC hdc, / handle to device context int X, / x-coordinate of pixel int Y, / y-coordinate of pixel COLORREF crColor / pixel color); GetPixelCOLORREF GetPixel( HDC hdc, / handle to device context int XPos, / x-coordinate of pixel int nYPos / y-coordinate of pixel);说明:用来获取指定坐标处的像素颜色; COLORREF用来指定一个RGB颜色#define RGB(r,g,b) (COLORREF(BYTE(r)| (WORD(BYTE)(g)8)| (DWORD(BYTE(b)16) 直线Windows可以画直线、椭圆线和贝塞尔样条。Windows98支持的7个画线函数是: LineTo 画直线 Polyline和PolylineTo 画一系列相连的直线 PolyPolyline 画多组相连的线 Arc 画椭圆线 PolyBezier和PolyBezierTo 画贝塞尔样条另外,Windows NT还支持3种画线函数 ArcTo和AngleArc 画椭圆线; PolyDraw 画一系列相连的线以及贝塞尔样条。既画线也填充所画图形的封闭区域的函数: Rectangle 画矩形 Ellipse 画椭圆 RounRect 画带圆角的矩形 Pie 画椭圆的一部分,使其看起来像一个扇形 Chord 画椭圆的一部分,以呈弓形设备描述表的5个属性影响着用这些函数所画线的外观:当前画笔的位置(仅用于LineTo、PolylineTo、PolyBezierTo和ArcTo)、画笔、背景方式、背景色和绘图模式。画一条直线,必须调用两个函数。第一个函数指定了线的开始点,第二各函数指定了线的终点:MoveToEx(hdc,xBeg,yBeg,NULL);LineTo(hdc,xEnd,yEnd); SINEWAVE程序/*- SINEWAVE.C - Sine Wave Using Polyline (c) Charles Petzold, 1998 -*/#include #include #define NUM 1000#define TWOPI (2 * 3.14159)LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow) static TCHAR szAppName = TEXT (SineWave) ; HWND hwnd ; MSG msg ; WNDCLASS wndclass ; wndclass.style = CS_HREDRAW | CS_VREDRAW ; wndclass.lpfnWndProc = WndProc ; wndclass.cbClsExtra = 0 ; wndclass.cbWndExtra = 0 ; wndclass.hInstance = hInstance ; wndclass.hIcon = LoadIcon (NULL, IDI_APPLICATION) ; wndclass.hCursor = LoadCursor (NULL, IDC_ARROW) ; wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH) ; wndclass.lpszMenuName = NULL ; wndclass.lpszClassName = szAppName ; if (!RegisterClass (&wndclass) MessageBox (NULL, TEXT (Program requires Windows NT!), szAppName, MB_ICONERROR) ; return 0 ; hwnd = CreateWindow (szAppName, TEXT (Sine Wave Using Polyline), WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance, NULL) ; ShowWindow (hwnd, iCmdShow) ; UpdateWindow (hwnd) ; while (GetMessage (&msg, NULL, 0, 0) TranslateMessage (&msg) ; DispatchMessage (&msg) ; return msg.wParam ;LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) static int cxClient, cyClient ; HDC hdc ; int i ; PAINTSTRUCT ps ; POINT apt NUM ; switch (message) case WM_SIZE: cxClient = LOWORD (lParam) ; cyClient = HIWORD (lParam) ; return 0 ; case WM_PAINT: hdc = BeginPaint (hwnd, &ps) ; MoveToEx (hdc, 0, cyClient / 2, NULL) ; LineTo (hdc, cxClient, cyClient / 2) ; for (i = 0 ; i NUM ; i+) apti.x = i * cxClient / NUM ; apti.y = (int) (cyClient / 2 * (1 - sin (TWOPI * i / NUM) ; Polyline (hdc, apt, NUM) ; return 0 ; case WM_DESTROY: PostQuitMessage (0) ; return 0 ; return DefWindowProc (hwnd, message, wParam, lParam) ; 相关函数原型 BOOL LineTo( HDC hdc, / device context handle int nXEnd, / x-coordinate of lines ending point int nYEnd / y-coordinate of lines ending point); BOOL Polyline( HDC hdc, / handle to device context CONST POINT *lppt, / pointer to array containing endpoints int cPoints / number of points in the array); BOOL PolylineTo( HDC hdc, / handle to device context CONST POINT *lppt, / pointer to array of points DWORD cCount / number of points in array); BOOL PolyPolyline( HDC hdc, / handle to a device context CONST POINT *lppt, / pointer to an array of points CONST DWORD *lpdwPolyPoints, / pointer to an array of values DWORD cCount / count of entries in the second array); BOOL Arc( HDC hdc, / handle to device context int nLeftRect, / x-coord of bounding rectangles upper-left corner int nTopRect, / y-coord of bounding rectangles upper-left corner int nRightRect, / x-coord of bounding rectangles lower-right corner int nBottomRect, / y-coord of bounding rectangles lower-right corner int nXStartArc, / first radial ending point int nYStartArc, / first radial ending point int nXEndArc, / second radial ending point int nYEndArc / second radial ending point); BOOL PolyBezier( HDC hdc, / handle to device context CONST POINT *lppt, / pointer to endpoints and control points DWORD cPoints / count of endpoints and control points); BOOL PolyBezierTo( HDC hdc, / handle to device context CONST POINT *lppt, / pointer to endpoints and control points DWORD cCount / count of endpoints and control points); BOOL MoveToEx( HDC hdc, / handle to device context int X, / x-coordinate of new current position int Y, / y-coordinate of new current position LPPOINT lpPoint / pointer to old current position); 程序片段 下面的代码从窗口的左上角开始,在客户区中画一个网格,线与线之间相隔100个像素。GetClientRect(hwnd,&rect);fox(x=0;xrect.right;x+=100) MoveToEx(hdc,x,0,NULL); LineTo(hdc,x,rect.bottom);for(y=0;yrect.bottom;y+=100) MoveToEx(hdc,0,y,NULL); LineTo(hdc,rect.right,y); 用画线函数画一个矩形POINT apt5=100,100,200,100,200,200,100,200,100,100;MovtToEx(hdc,apt0.x,apt0.y,NULL);for(i=1;i5;i+) LineTo(hdc,apti.x,apti.y);注意:最后一个点与第一个点坐标相同。 用Polyline函数画矩形Polyline(hdc,apt,5);/等同于Polyline(hdc,apt,sizeof(apt)/sizeof(POINT);注意:虽然与效果相同,但Polyline既不使用也不改变当前位置。PolylineTo则不同,它使用当前位置作为开始点,并将当前位置设置为最后一根线的终点。MoveToEx(hdc,apt0.x,apt0.y,NULL);PolylineTo(hdc,apt+1,4); 边界框函数Rectangle、Ellipse、RoundRect、Chord、Pie函数是在画线,但它们同时又在使用当前的区域填充一个封闭区域。这些函数的共性是基于一个矩形边界框的。用户定义一个包含该对象的框,即“边界框”;Windows就在这个框内画出该对象。 RectangleRectangle(hdc,1,1,5,4);画矩形边框示意图: Ellipse函数 RoundRect函数 Arc函数 Chord函数 Pie函数 LineDemo程序片段LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) static int cxClient, cyClient ; HDC hdc ; PAINTSTRUCT ps ; switch (message) case WM_SIZE: cxClient = LOWORD (lParam) ; cyClient = HIWORD (lParam) ; return 0 ; case WM_PAINT: hdc = BeginPaint (hwnd, &ps) ; Rectangle (hdc, cxClient / 8, cyClient / 8, 7 * cxClient / 8, 7 * cyClient / 8) ; MoveToEx (hdc, 0, 0, NULL) ; LineTo (hdc, cxClient, cyClient) ; MoveToEx (hdc, 0, cyClient, NULL) ; LineTo (hdc, cxClient, 0) ; Ellipse (hdc, cxClient / 8, cyClient / 8, 7 * cxClient / 8, 7 * cyClient / 8) ; RoundRect (hdc, cxClient / 4, cyClient / 4, 3 * cxClient / 4, 3 * cyClient / 4, cxClient / 4, cyClient / 4) ; EndPaint (hwnd, &ps) ; return 0 ; case WM_DESTROY: PostQuitMessage (0) ; return 0 ; return DefWindowProc (hwnd, message, wParam, lParam) ;五 画笔 使用现有画笔(Stock Pens) Windows使用设备描述表中当前选中的“画笔”来画线。画笔决定线的色彩、宽度和线型,线型可以是实线、点划线或者虚线,默认设备描述表中画笔为BLACK_PEN。不管映射方式是什么,这种画笔都画出一个像素宽的黑色实线来。除了BLACK_PEN
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 农发行绥化市望奎县2025秋招信息科技岗笔试题及答案
- 农发行绵阳市涪城区2025秋招无领导模拟题角色攻略
- 国家能源防城港市上思县2025秋招心理测评常考题型与答题技巧
- 国家能源沧州市沧县2025秋招笔试资料分析题专练及答案
- 国家能源滨州市沾化区2025秋招笔试模拟题及答案
- 2025年4月广东深圳市福田区区属公办高中面向全国遴选校长1人考前自测高频考点模拟试题及一套完整答案详解
- 医生感人事迹演讲稿
- 同桌的道歉信
- 农药化肥买卖合同5篇
- 2025年鹤壁黎阳中学招聘教师若干名模拟试卷及答案详解(历年真题)
- 涉密测绘成果管理制度
- 2025-2030中国汽车结构胶行业市场发展趋势与前景展望战略研究报告
- T/CHC 1005-2023破壁灵芝孢子粉
- 图像几何变换讲解
- 高一上学期《国庆假期安全教育+时间规划》主题班会课件
- 分拣部管理制度
- 2025年铁路货装值班员(高级)职业技能鉴定参考试题库(含答案)
- 2024年单招数学函数的性质专项复习试题和答案
- 星级酒店的各类客房类型介绍
- 2024-2025学年高一下学期《唤醒内驱力-开启自主学习成长之旅》主题班会课件
- 养成良好习惯遇见更好自己-2025年春季学期习惯养成教育主题班会课件
评论
0/150
提交评论