《Windows API每日一练》4.1 GDI绘图

本节必须掌握的知识点:

        GDI原理

        GDI函数调用

        GDI基本图形

4.1.1 GDI原理

GDI,全称是Graphics Device Interface(图形设备接口),是微软Windows操作系统中提供的一套用于渲染图形和格式化文本的API(应用程序接口)。GDI提供了一种相对简单的方式来进行二维图形绘制,包括线段、矩形、椭圆、多边形、位图和文本等。

GDI的核心原理涉及到了以下几个重要的内容:

1.设备上下文(Device Context,DC):设备上下文是GDI的核心概念,它是一个数据结构,包含了在设备中绘图的所有信息。包括绘图的颜色、字体、绘图模式等等。当你想要在窗口或者位图上绘图时,需要先获取或者创建对应的设备上下文。

2.GDI对象: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 = GetDC(hWnd);

//GetDC(NULL)时为屏幕DC

//其他代码

Release(hWnd,hDC);

2.获取整个窗口DC(含非客户区)

hDC = GetWindowDC(hWnd);

//其他代码

Release(hWnd,hDC);

●更通用的方法(未必一定要窗口相关联,也可以是内存或打印机的DC)

1.整个屏幕DC

 hDC =CreateDC(TEXT(“DISPLAY”),NULL,NULL,NULL);// “DISPLAY”为屏幕

 DeleteDC(hDC);

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等。

■文本输出函数:显示文本,以及对文本进行格式化、计算大小等,像TextOut,DrawText,GetTextExtentPoint32等。

■坐标和变换函数:进行坐标变换,包括设置视口和窗口,以及世界变换,包括SetViewportOrgEx,SetWindowExtEx,SetWorldTransform等等。

■裁剪和区域函数:定义和使用复杂的裁剪区域,像SelectClipRgn,CreateRectRgn等。

■滚动条和画面滚动函数:用于处理滚动条和滚动视图,包括ScrollWindow,SetScrollInfo,GetScrollInfo等。

■绘图控制函数:这些函数用于操作颜色和设置模式,例如SetBkMode,SetBkColor,SetTextColor等。

所有这些函数都可以在微软官方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)决定。你可以使用CreatePen,CreateSolidBrush等函数来创建画笔和画刷,并使用SelectObject函数来选择它们。

GDI的其他方面

◆映射模式(mapping mode)和转换( transform)。尽管在默认时是以像素为单位进行绘制的,但并不是别无选择。GDI的映射模式允许以英寸(甚至几分之一英寸)、毫米或者其他你所想要的任何单位进行绘制。

◆图元文件( metafile)。一个图元文件是以二进制形式存储的GDI命令的集合。图元文件主要用于通过剪贴板转换矢量图形绘制的表现形式。我将在第十七章讨论图元。

◆区域( region)。区域是一个任意形状的封闭图形,通常可以表示为由一系列简单区域进行布尔运算后得到的结果。在GDI内部,可以使用一个从已知区域出发的一系列扫描线来定义一个复杂的区域。可以使用区域进行轮廓绘制、填充或者剪裁。

◆路径(path)。路径是存储在GDI内部的直线和曲线的集合。可以用于绘制、填充和剪裁。路径还可以转换为区域。

◆剪裁( (clipping)。当绘图被限制在客户区的一个特定的空间位置时,就发生了剪裁。那个特定的空间位置可以是矩形或者非矩形,它通常被指定为一个区域或者一个路径。

◆调色板( palettes)。仅在支持256种颜色时,才能使用自定义的调色板。 Windows仅保留其中的20种色彩以供系统使用。你可以改变其他236种色彩,这样就可以准确显示按位图形式存储的真实图像。我将在第十五章讨论调色板。

◆打印 printing)。尽管本章只讨论视频显示器。但在本章学到的所有知识几乎都可以应用于打印机。我将在第十三章讨论打印机。

  • 16
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值