源地址:http://www.2cto.com/kf/201008/54515.html
设备对象属性决定着绘图方式,当使用GDI函数绘图时,所绘制的图形和文本的颜色、大小和位置等由设备对象的当前属性决定,应用程序可以使用GDI函数改变设备对象的当前属性。本章介绍设备对象的一些主要属性和用于改变这些属性的有关函数,其它的设备对象属性在后面的章节中陆续介绍。
3.1、图形设备接口
在第二章,我们一直在使用图形设备接口(
GDI),GDI的主要目标之一是支持在输出设备(例如显示器、打印机)上建立与设备无关的图形输出。Windows的图形大部分是由GDI.EXE(Windows系统的一个模块,称GDI模块)中的函数处理的。GDI模块通过调用在不同设备驱动程序模块中的例程来控制输出设备。例如,显示设备驱动程序用于访问与视频显示器有关的硬件。通过GDI,Windows可以确定驱动程序能够进行什么工作,并且由于应用程序只与GDI打交道。这样,GDI通过将应用程序与不同的输出设备隔离,使应用程序可以在支持Windows的任何图形输出设备上工作。
图形输出设备可以分为两组:光栅设备和矢量设备。光栅设备将图象表示为点(象素)的图案。这类输出设备包括显示设备、点阵打印机和激光打印机。向量设备用线段来绘制图象,例如绘图仪。Windows的GDI是一种隔离了硬件具体特性的图形语言。虽然输出设备用象素来表示图形,但GDI却可以被用作一个高级的向量绘图系统,也可以被用来进行较低级的象素操作。
在编写Windows应用程序时,程序员不必为颜色过分担心,如果在应用程序中使用的一种颜色不能被该显示器所表示,Windows或为应用程序选择一种最直接的纯颜色(显示设备可以表示的颜色),或通过将几种纯颜色相混合来表示这种颜色。当在彩色显示器上开发的程序运行在单色显示器上时,Windows将使用灰度来表示颜色。应用程序也可以在程序中确定输出设备的有关特性,例如,可表示的颜色数目、设备的显示区的尺寸等,以便最大限度地发挥硬件的能力。
3.2、设备对象属性
设备对象具有许多决定GDI函数在设备对象上如何工作的当前属性。例如,在使用函数TextOut()时,只需要在函数中说明设备对象的句柄、绘制字符的起始坐标、文本和文本长度,而不用说明字体、文本颜色、背景颜色和字符间距等,因为这些特征由设备对象的属性决定。每种设备对象都赋有缺省的属性,可以使用GDI函数改变这些属性中的某一个。表3-1给出了显示设备各个属性的缺省值,当使用GetDC()和BeginPaint()等函数初次得到一个显示设备对象时,该对象的属性具有缺省值。
属性 |
缺省值 |
视区原点 |
(0, 0) |
视区范围 |
(1, 1) |
窗口原点 |
(0, 0) |
窗口范围 |
(1, 1) |
背景颜色 |
白色 |
背景方式 |
OPAQUE |
位图 |
任意值 |
刷子 |
WHITE_BRUSH |
刷子原点 |
(0, 0) |
裁剪区 |
用户区/无效矩形区/子窗口区 |
调色板 |
DEFAULT_PALETTE |
|
|
属性 |
缺省值 |
笔的当前位置 |
(0, 0) |
笔的颜色 |
BLACK_PEN |
文本颜色 |
黑 |
设备的原点 |
用户区的左上角 |
绘图方式 |
R2_COPYPEN |
字体 |
SYSTEM_FONT |
字符间距 |
0 |
映射方式 |
MM_TEXT |
多边形填充方式 |
ALTERNATE |
相对一绝坐标 |
ABSOLUTE |
缩放方式 |
BLACKONWHITE |
|
在本章以后的各节中将介绍其中一些设备属性,其它属性在以后章节中介绍。
3.3、设备坐标系
为在输出设备上定位和绘制图形对象,必须引入一种坐标系。Windows的各种不同类型设备所使用的坐标称为设备坐标。它们使用笛卡尔坐标系,在这些设备坐标系中,单位都以象素的个数表示(称为设备单位)。x轴上的值自左向右增加,y轴上的值自顶向下增加,见图3-1。
|
图3-1 Windows的设备坐标系 |
本节以视频显示设备为例介绍Windows的设备坐标系,其中的许多内容也适合用于象打印机等硬拷贝输出设备。
在Windows环境中,视频显示设备是一个共享设备,即在同一时刻,显示设备上可以同时显示多个应用程序的输出信息。为了保护一个程序显示的信息不被其他程序破坏,Windows通过将显示区看作不同的设备对象来限制应用程序输出信息的范围。
一个应用程序可获取三种不同的显示设备对象句柄,每种句柄所标识的设备对象代表屏幕上的不同区域。我们可以将这三个句柄所标识的对象视作三个不同的抽象显示设备,都带有如图3-1所示的设备坐标系,但对不同的抽象设备,坐标原点不一样的。这样,当使用相同的起始坐标而使用不同的设备对象句柄调用GetDC函数(例如TextOut())进行绘图时,信息显示的位置不一样。
第一抽象设备是用户区对象,它的坐标原点在用户区的左上角。定位该区域的设备坐标系称为用户区坐标系。使用函数GetDC()或BeginPaint()得到的句柄是标识用户区的句柄。当使用该句柄标识该区域的句柄作为GDI函数的参数时,GDI函数所使用的坐标值是相对于用户区坐标系。
第二个抽象设备是全窗口对象。它包括标题栏、选单、滚动杆和窗口框架等。定位这个区域的坐标系称为全窗口坐标系,它的原点的左上角。使用函数GetWindowsDC()可以获得该设备对象的句柄,然后通过该句柄使用全窗口坐标系在该区域中绘图。应用程序一般不在这个区域中绘图。
第三个抽象设备是整个屏幕对象,其坐标原点在屏幕的左上角,定位该区域的设备坐标系称为屏幕坐标系。使用语句:
HDC hDC = CreateDC("DISPLAY", NULL, NULL, NULL);
可以获得该设备对象的句柄,使用该句柄的GDI函数所使用的坐标是相对于屏幕坐标系。
这三种坐标系方便了程序在不同的区域绘制图形的需要。例如,由于使用用户区坐标系,即使窗口在屏幕上被移动到其他位置,但用户区中显示的信息相对于用户坐标系而言其坐标值不变。
使用坐标系,解决了显示对象的定位的问题的。但以象素单位所建立的坐标系不符合用户(或程序员)的习惯,而且在不同分