辽宁省建设厅注册中心网站,这里是我做的网站,程序员软件开发,网站列表效果本节必须掌握的知识点#xff1a; GDI原理 GDI函数调用 GDI基本图形
4.1.1 GDI原理
GDI#xff0c;全称是Graphics Device Interface#xff08;图形设备接口#xff09;#xff0c;是微软Windows操作系统中提供的一套用于渲染图形和格式化文本的API#xff08;应用程序…本节必须掌握的知识点 GDI原理 GDI函数调用 GDI基本图形
4.1.1 GDI原理
GDI全称是Graphics Device Interface图形设备接口是微软Windows操作系统中提供的一套用于渲染图形和格式化文本的API应用程序接口。GDI提供了一种相对简单的方式来进行二维图形绘制包括线段、矩形、椭圆、多边形、位图和文本等。
GDI的核心原理涉及到了以下几个重要的内容
1设备上下文Device ContextDC设备上下文是GDI的核心概念它是一个数据结构包含了在设备中绘图的所有信息。包括绘图的颜色、字体、绘图模式等等。当你想要在窗口或者位图上绘图时需要先获取或者创建对应的设备上下文。
2GDI对象GDI使用了许多不同的GDI对象来代表绘图的各个方面。例如使用画笔Pen对象来表示线条的颜色和粗细使用字体Font对象来表示字体等等。在需要绘制图形或者文本时需要先创建并选择对应的GDI对象到设备上下文中。
3绘图函数GDI提供了一系列的函数来进行图形和文本的绘制。例如LineTo函数用于绘制线段Rectangle函数用于绘制矩形TextOut函数用于输出文本等等。这些函数根据设备上下文中当前选择的GDI对象来执行绘图动作。
4坐标系和变换GDI使用坐标系来确定绘制图形的位置包括设备坐标、逻辑坐标和窗口坐标等。GDI还提供了变换函数如缩放、旋转和平移等可以改变绘制物体的位置和形状。
总的来说GDI是Windows操作系统中的一个重要组成部分它提供了一套API来处理图形、文本和图像等图形操作。通过使用GDI开发者可以实现各种图形和界面效果使应用程序具有更丰富的视觉体验。
GDI的一个主要目的就是支持与设备无关的图形。 Windows程序应当毫无问题地在 Windows所支持的任何图形设备上输出。GDI提供了一种特殊的机制来彻底隔离应用程序和不同输出设备的特性这样就可以支持与设备无关的图形。
图形输出设备被分为两大类光栅设备 raster device和矢量设备 vector device。大多数PC输出设备是光栅设备这也就意味着它们将图像表示成以点的形式构成的矩阵。该类输出设备有视频显示适配器、点阵打印机和激光打印机。矢量设备则使用线条来绘制图通常指绘图机 。
大多数传统地计算机图形程序完全以矢量为主。输出设备使用像素表示图形但程序并不以像素的形式来调用输出设备的接口函数。Windows GDI可以看作是一个高层的矢量绘制系统来使用也可以使用它来进行相对底层的像素操作。
在这个方面来看Windows GDI与传统图形接口语言之间的关系类似于 C与其他编程语言的关系。C的闻名之处在于它在不同操作系统和环境之间的高度可移植性。还有就是允许程序员执行底层系统函数这是其他高级语言做不到的。就如图C常被当成“高级汇编语言”一样你可以把GDI当成图形设备硬件的一种高层接口。
如前所述 Windows默认使用以像素为单位的坐标系统。大多数传统的图形语言都使用一个“虚拟”坐标系统它的横轴和纵轴的范围是0~32767。尽管一些图形语言并不允许使用像素坐标但是 Windows GDI允许使用任何一种坐标系统可以使用其他依据物理测量得到的坐标系统所以你可以使用虚拟坐标系统来保证程序与硬件独立也可以使用设备坐标系统来完全迎合硬件的需求。
4.1.2 GDI函数调用
在Windows编程中GDI图形设备接口的函数主要可以分为以下几个类别 ■获取设备环境句柄
设备上下文Device Context函数包括获取和释放设备上下文如GetDC、ReleaseDC保存和恢复设备上下文状态如SaveDC、RestoreDC。
●在WM_PAINT中获取的是无效区的句柄 hDC BeginPaint(hWnd,ps); //其他代码 EndPaint(hWnd,ps); ●在非WM_PAINT中
1获取整个客户区DC
hDC GetDChWnd;
//GetDC(NULL)时为屏幕DC
//其他代码
Release(hWnd,hDC); 2获取整个窗口DC含非客户区
hDC GetWindowDChWnd;
//其他代码
Release(hWnd,hDC);
●更通用的方法未必一定要窗口相关联也可以是内存或打印机的DC
1整个屏幕DC hDC CreateDC(TEXT(“DISPLAY”)NULLNULLNULL);// “DISPLAY”为屏幕 DeleteDChDC; 2内存DC hdcMem CreateCompatibleDC(hDC); DeleteDC(hdcMem); 3获得图元文件的设备环境句柄 hdcMeta CreateMetaFile(pszFileName); hmf CloseMetaFile(hdcMeta); ●只需要获取设备环境信息而无需创建设备上下文 DC。
CreateIC 函数用于创建一个与指定设备相关的设备上下文该设备上下文可以用于进行绘图操作。它通常用于创建一个用于绘制到屏幕或打印机的设备上下文。 ■GDI对象函数
GDI对象函数创建和删除画笔、画刷、字体等GDI对象如CreatePen、CreateBrush、CreateFont选择这些对象进入设备上下文如SelectObject以及获取和设置这些对象的属性如GetLogPen、SetLogBrush。 ■绘图函数用来绘制线条、形状和图像如LineTo、Rectangle、Ellipse、Polygon以及BitBlt、StretchBlt等。 ■文本输出函数显示文本以及对文本进行格式化、计算大小等像TextOutDrawTextGetTextExtentPoint32等。 ■坐标和变换函数进行坐标变换包括设置视口和窗口以及世界变换包括SetViewportOrgExSetWindowExtExSetWorldTransform等等。 ■裁剪和区域函数定义和使用复杂的裁剪区域像SelectClipRgnCreateRectRgn等。 ■滚动条和画面滚动函数用于处理滚动条和滚动视图包括ScrollWindowSetScrollInfoGetScrollInfo等。 ■绘图控制函数这些函数用于操作颜色和设置模式例如SetBkModeSetBkColorSetTextColor等。
所有这些函数都可以在微软官方MSDN网址上找到详细说明和示例。
4.1.3 GDI基本图形
在GDI图形设备接口中一些基本的图形包括线Line、矩形Rectangle、圆Circle、椭圆Ellipse、多边形Polygon、多线段Polyline等等。 ■基本图形
◆线使用MoveToEx函数来设置起始点然后使用LineTo函数来绘制一条从起始点到指定点的线段。
◆矩形使用Rectangle函数来绘制一个矩形参数指定了矩形的左上角和右下角的位置。
◆圆和椭圆使用Ellipse函数来绘制一个椭圆参数同样指定了椭圆所在的矩形的左上角和右下角的位置。如果该矩形是正方形那么绘制出的椭圆就是一个圆。
◆多边形使用Polygon函数来绘制一个多边形。你需要指定一个点数组其中每个点表示多边形的一个顶点然后GDI会按照顶点的顺序连接线段并自动连接第一个点和最后一个点来关闭多边形。
◆多线段使用Polyline函数来绘制一系列的线段。和Polygon一样你会提供一个点数组但是GDI仅仅只是按顺序连接这些点而并不会尝试去关闭图形。
◆可被填充的封闭区域。当一系列的线条或者曲线构成一个封闭区域时你可以使用当前GDI的画刷对象填充这个区域。这个画刷可以是纯色的,或者是使用某种填充模式如一系列水平的、垂直的或者倾斜的图案还可以是在水平或垂直方向不停重复的位图图像。
◆位图。位图是一个二维的位数组每一个元素都对应显示设备上的一个像素是光栅图形的基础。位图通常用于在显示器或者打印机上显示复杂通常是真实世界的图像。位图也通常用于显示必须要快速绘制的小图像例如图标、鼠标指针以及出现在应用程序工具栏里的按钮。GDl支持两种类型的位图旧式的尽管现在仍然十分常用“设备相关”位图它属于GDI对象和新式的从Windows3.0起“设备无关”位图DIB。DIB可以存放在磁盘文件中。我将在第章和第十四章讨论位图。
◆文本。文本通常是任何计算机图形系统中最复杂的部分。在所有 Windows的数据结构中用于定义GDI字体对象和获取字体信息的数据结构是最庞大的。GDI从 Windows3.1开始支持 TrueType字体这种字体是以填充的轮廓线为基础的某些GDI函数可以操控这些轮廓线。 Windows98还继续支持旧式的基于位图的字体因为它的兼容性较好对内存需求也小。我们将在第十六章讨论字体。
所有这些图形的颜色和样式由当前选择进设备上下文Device Context的画笔Pen和画刷Brush决定。你可以使用CreatePenCreateSolidBrush等函数来创建画笔和画刷并使用SelectObject函数来选择它们。 ■GDI的其他方面
◆映射模式mapping mode和转换 transform。尽管在默认时是以像素为单位进行绘制的但并不是别无选择。GDI的映射模式允许以英寸甚至几分之一英寸、毫米或者其他你所想要的任何单位进行绘制。
◆图元文件( metafile)。一个图元文件是以二进制形式存储的GDI命令的集合。图元文件主要用于通过剪贴板转换矢量图形绘制的表现形式。我将在第十七章讨论图元。
◆区域( region)。区域是一个任意形状的封闭图形,通常可以表示为由一系列简单区域进行布尔运算后得到的结果。在GDI内部,可以使用一个从已知区域出发的一系列扫描线来定义一个复杂的区域。可以使用区域进行轮廓绘制、填充或者剪裁。
◆路径(path)。路径是存储在GDI内部的直线和曲线的集合。可以用于绘制、填充和剪裁。路径还可以转换为区域。
◆剪裁( (clipping)。当绘图被限制在客户区的一个特定的空间位置时,就发生了剪裁。那个特定的空间位置可以是矩形或者非矩形,它通常被指定为一个区域或者一个路径。
◆调色板( palettes)。仅在支持256种颜色时,才能使用自定义的调色板。 Windows仅保留其中的20种色彩以供系统使用。你可以改变其他236种色彩这样就可以准确显示按位图形式存储的真实图像。我将在第十五章讨论调色板。
◆打印 printing)。尽管本章只讨论视频显示器。但在本章学到的所有知识几乎都可以应用于打印机。我将在第十三章讨论打印机。