29、Windows API GDI(1)

简介: GDI是Graphics Device Interface(图形设备接口)的简称,当Windows应用程序需要显示点、线、图像、文字等内容,在显示器或打印输入这些内容时,就需要使用到GDI。图形设备接口是Windows图形界面的基础。

    GDIGraphics Device Interface(图形设备接口)的简称,当Windows应用程序需要显示点、线、图像、文字等内容,在显示器或打印输入这些内容时,就需要使用到GDI。图形设备接口是Windows图形界面的基础。应用程序当然不能直接操作系统的硬件,比如显卡,GDI就为应用程序提供了相关的接口。<?xml:namespace prefix = o />

    GDI不是可以实现这种功能的唯一程序设计接口,GDI只是其中最基本的。除了GDI外,还有GDI+OpenGLDirectXWindows Image Acquisition等可以实现类似或更高级的功能。

1Windows GDI的功能

    简单列举,GDI包括如下一些功能。

◇获取输出设备的输出,可以截获当前显示器显示的内容,包括整个屏幕、指定窗口或其他任意部分。

◇控制显示器的输出内容,在显示器的指定位置输出指定的内容。应用程序可以指定输出的位置、颜色、大小、区域。

◇可以以点、线条(直线、曲线)、图形、位图、文字等方式输出。

◇可指定输出内容的颜色、大小、位置。

◇可将输出内容进行变形、变色、字体的处理等。

2、一些基本概念

1DC(设备上下文,Device Contexts)GDI程序设计中最基本的概念。DC是一种对象,设定了图形输出的特性与属性。系统中可以具有多个DC,每一个DC都有一个与之对应的关联设备,有一系列的图形对象,还包括图形模式。

2)设备上下文类型与关联设备

    一个DC所关联的设备驱动决定了通过此DC进行的图形输出操作(文字输出、绘制、填充等)会被哪个设备(包括显示器、打印机、绘图仪)或设备的子区域(窗口客户端等)所接收。

    每一个DC都必须关联到一个特定的图像输出设备,这些设备可以是真实存在的物理设备,包括显示器、打印机、绘图仪等,也可以是虚拟的设备。比如一个DC关联到了VGA屏幕(显示器),那么所有通过这个DC进行的图形输出操作,都会在上显示器上显示出来。

    DC也可以只是设备全部输出范围的一部分。比如界面上某个窗口的客户区也可以有DC与之对应,对这样的DC进行操作只会影响到窗口客户区。

    设备上下文还具有4种类型,分别是“显示”、“打印机”、“内存”、“信息”。

    显示类型DC关联到了显示设备,所有的图像输出操作将直接反映在显示器上。“打印机”DC类型的绘制操作将反映在打印机上;对“内存”类型的DC的绘制操作将所有操作结果反映到内存数据中,不会有输出显示。而“信息”类型的DC可以用于获取DC的相关信息和属性等数据。

    应用程序在进行图像输出时,只需要关心DC的类型,如果需要将图像输出到特定的设备只需创建相应类型的DC即可。而对不同类型的DC的操作方式都是统一的,应用程序不需要关注设备硬件的异同,无论哪种设备数据接口、哪种通信数据的格式等都是同样的处理,GDI的接口都是相同的。

3)图形对象的作用及与DC的关系

    一个DC中还包括了一系列的图形对象,所谓图形对象会影响到对DC的输出操作的结果。

    比如TextOut函数就是一种输出操作,这种操作会将文字显示在DC所关联的设备上,那么“字体”这种图形对象就决定了输出的文字的形式,包括具体字的形状、大小、颜色等。

    再比如LineTo函数也是一种输出操作,这种操作会在指定的DC所关联的设备上绘制出直线,而“画笔”这种图形对象就决定了所输出线条的颜色、粗细、虚实、线头形状等。

wps_clip_image-1811

应用程序可以创建新的图形对象,比如使用CreatePen创建画笔对象。

当一个应用程序创建一个DC时,系统会为DC创建默认的图形对象(路径和位图除外)。

    为DC设置当前对象最重要的API函数是SelectObjectSelectObject函数的功能是将对象“选择入”DC,使对象成为DC当前的对象,并替换原有对象。

Device Contexts[2]

4)相关的API

SelectObject[3]

5)常备(Stock)图形对象

GDI已经将一些常用的图形对象作为常备图形对象。通过调用API函数GetStockObject来获得常备图形对象的句柄。

6)各类图形对象的具体属性与作用

1)位图( bitmap)

    位图是一种图形对象(Graphical Object),是用于表示图像(images)的数据和结构。程序使用位图来操作和管理图像。

    位图数据包括3个部分。

    第一个部分是一个位图信息头,用于说明分辨率、长度与宽度(像素)、表示一个像素点所使用的数据大小(8位、16位、24位等),一般是BITMAPINFOHEADER类型的结构。

    第二个部分是可选的调色信息,一般是RGBQUAD类型的结构或一组RGBTRIPLE类型的数据。

    第三部分是各个像素点的颜色表示,表示一个像素点的颜色有多种长度的数据。比如如果使用4位表示一个像素,那么可以有16种颜色,如果使用16位数据表示一个像素点,那么可以有65 536种颜色。

    位图数据的这3个部分依次保存在内存中。如果将内存中的位图数据保存为文件,那么还需要在第一个部分之前增加位图文件头。

2)画笔刷( Brush)

    应用程序可以使用画笔刷绘制各种形状的图形、线条、阴影等。

画笔刷又分为逻辑画笔刷和物理画笔刷,逻辑画笔刷可以绘制各种形状,而物理画笔刷是基于逻辑画笔刷的位图。

3)字体( Font)

    字体包括3个方面,一是字体图样(Typeface),即表示一个字所使用的像素点阵;二是样式(Style),包括粗、细、加黑等;三是尺寸,以像素点为单位。

4)路径( Path)

    PathGDI中用于表示任意的形状。

    Path可以是“填充的”(filled)、“边沿勾勒的”(outlined)。分别可以使用不同的颜色来填充其内部,勾勒其边沿。Path在被创建后可以填充、勾勒、变形、裁减(Clip),还可以转换为“区域”(Regions)

5)画笔( Pens)

    “画笔”可以在界面上绘制出线条。所绘制的线条可以是直线、手绘线和各种函数曲线。

    GDI程序中的画笔分为两种,一种是装饰画笔(Cosmetic Pens),另一种是几何画笔(Geometric Pens)

    装饰画笔:是设备单元,较快,不受坐标空间变化的影响,所绘制的线条宽度一定,只具有宽度、样式和颜色3种属性。

    几何画笔:是几何单元,较慢,受到坐标空间变化的影响,具有多种属性。

    画笔还具有属性,包括宽度、样式、颜色、模式(Pattein)、影线(Hatch)、线端(End Cap)、结合方式(join)等。

样式表示了画笔所绘制的线条可以是实线,短横虚线、点虚线、短横一点虚线、短横--点虚线等。

画笔具有阴影( Hatch)、实心(Solid)(Hollow)、自定义等模式。当使用LineTo等函数在DC上输入线条时,线条的样式由DC当前的画笔对象定义。

6)区域( Regions)

    区域表示了DC中的特定位置和范围,可以是矩形、多边形、椭圆及其组合。

7)调色板

调色板定义了DC可以显示的颜色的数量和颜色值。

7)输出操作

wps_clip_image-5714

8)修剪与坐标变换

修剪与坐标变换是两种重要的操作。

1)修剪(Clipping)

    修剪是一种限制输出范围和位置的机制。

    修剪通过路径(Paths)和区域(Regions)对输出操作的范围作出限制,对输出的内容进行处理。“修剪区域”和“修剪路径”是两种图形对象,都可以“选择入”DC。分别可以使用规制和不规则图形来对输出的范围作出限制。

    如果在DC选择入了“修剪”图形对象,那么在进行输出操作时,并不是整个DC的范围都有效。所输出的文字、线条、图形等只有位于修剪区之内的才会被输出。

2)坐标空间及变化

    坐标空间及变化可以使应用程序能够将图像输出进行坐标变换,包括比例变化(放大、缩小)、旋转、扭曲、反转。

    GDI中的坐标空间是一个二维平面空间,使用二维坐标表示。

    坐标空间有4种:worldpage、设备和物理设备(客户区、桌面、打印纸)。

可以基于坐标空间进行坐标空间的数学变换,以达到变化图形的目的。

9)设备上下文的图形模式

所谓DC的图形模式是指在通过DC进行输出操作时所遵循的原则。例如颜色混合的方式、输出出现的方式、输出的尺度等。

wps_clip_image-13638

参考

[1] 精通Windows API 函数、接口、编程实例

[2] http://msdn.microsoft.com/en-us/library/dd183553%28VS.85%29.aspx

[3] http://msdn.microsoft.com/en-us/library/dd162957%28VS.85%29.aspx

目录
相关文章
|
6月前
|
监控 编译器 API
[笔记]Windows核心编程《二十二》注入DLL和拦截API(一)
[笔记]Windows核心编程《二十二》注入DLL和拦截API
143 0
|
3月前
|
API Python Windows
python3应用windows api对后台程序窗口及桌面截图并保存的方法
python3应用windows api对后台程序窗口及桌面截图并保存的方法
90 1
|
7月前
|
编解码 应用服务中间件 开发工具
Windows平台RTMP|RTSP播放器为什么要兼容GDI绘制
先说结论,Windows平台播放渲染这块,一般来说99%以上的机器都是支持D3D的,实现GDI模式绘制,除了为了好的兼容性外,在远程连接的场景下,D3D创建不成功,需要使用GDI模式。
|
6月前
|
存储 缓存 API
[总结]Windows Crypto API 自动更新根证书问题原因及解决方案
[总结]Windows Crypto API 自动更新根证书问题原因及解决方案
|
6月前
|
API Windows
[笔记]Windows核心编程《番外篇》常用的NT API及使用示例
[笔记]Windows核心编程《番外篇》常用的NT API及使用示例
|
6月前
|
安全 API Windows
[笔记]Windows核心编程《二十二》注入DLL和拦截API(三)
[笔记]Windows核心编程《二十二》注入DLL和拦截API(三)
133 0
|
6月前
|
消息中间件 编解码 安全
[笔记]Windows核心编程《二十二》注入DLL和拦截API(二)
[笔记]Windows核心编程《二十二》注入DLL和拦截API(二)
103 0
|
6月前
|
API C++ Windows
Windows API Hooking 学习
Windows API Hooking 学习
|
10月前
|
缓存 安全 Unix
C/C++使用Windows的API实现共享内存以及同步
C/C++使用Windows的API实现共享内存以及同步
757 0
|
10月前
|
安全 Java 编译器
如何用 Go 调用 Windows API | 青训营笔记
如何用 Go 调用 Windows API | 青训营笔记
809 0