装置内容(简称DC)实际上是GDI内部保存的资料结构。装置内容与特定的显示设备(如视讯显示器或印表机)相关。
系统字体是Windows 用来在标题列、功能表和对话方块中显示字串的内定字体。
系统字体是一种「点阵字体」,这意味著字元被定义为图素块。至於确切的大小,系统字体的字元大小取决於视讯显示器的大小。系统字体设计为至少能在显示器上显示25 行80 列文字。
GetSystemMetrics 是在程式中完成与装置无关图形输出的重要函式。
GDI:Graphics Device Interface 图形装置介面
图形输出设备分为两大类:位元映射设备和向量设备。
GDI函式呼叫分为:
1、取得(或者建立)和释放(或者清除)装置内容的函式,如:GetDC和RealseDC
2、取得有关装置内容资讯的函式,如GetTextMetrics
3、绘图函式,如TextOut
4、设定和取得装置内容参数的函式,如SetTextAlign
5、使用GDI物件的函式,如画笔、字体、点阵图等
GDI基本图形:
1、直线和曲线 2、填入区域 3、点阵图 4、文字
GDI物件包括:逻辑画笔、画刷、点阵图、字体、区域和调色板
取得装置内容代号的另一个更通用的函式是CreateDC: hdc = CreateDC (pszDriver, pszDevice, pszOutput, pData) ;
您可以通过下面的呼叫来取得整个萤幕的装置内容代号:hdc = CreateDC (TEXT ("DISPLAY"), NULL, NULL, NULL) ;
有时您只是需要取得关於某装置内容的一些资讯而并不进行任何绘画,在这种情况下,您可以使用CreateIC 来取得一个「资讯内容」的代号,其参数与CreateDC 函式相同。
通过呼叫GetDeviceCaps(「取得设备功能」)函式来取得显示器的大小和色彩显示能力的资讯:iValue = GetDeviceCaps (hdc, iIndex) ;
使用「图素大小」或「图素尺寸」表示设备水平或垂直显示的总图素数。「度量大小」或「度量尺寸」是以英寸或毫米为单位的设备显示区域的大小。(对於印表机页面,它不是整个页面,只是可列印的区域。)图素大小除以度量大小就得到解析度。
现在Windows 使用的大多数视讯显示器的萤幕都是宽比高多33%
HORZSIZE和VERTSIZE,文件中称为「以毫米计的实际萤幕的宽度」及「以毫米计的实际萤幕的高度」
理论上,字体的点值是从字体中最高的字元顶部到例如j、p、q 和y 等字母下部的字元底部的距离,其中不包括重音符号。
当您在「控制台」的「显示」程式上选择小字体或大字体时,实际上是选择了一个假定的视讯显示解析度,单位是每英寸的点数 。当选择小字体时,即要Windows 假定视讯显示解析度为每英寸96 点。当选择大字体时,即要Windows 假定视讯显示解析度为每英寸120 点。
LOGPIXELS 指逻辑图素,它的基本意思是「以每英寸的图素数为单位的非实际解析度」。
如果视讯显示卡仅显示黑色图素和白色图素,则每个图素只需要记忆体中的一位元。彩色显示器中每个图素需要多个位元。位元数越多,色彩越多,或者更具体地说,可以同时显示的不同色彩的数目等於2 的位元数次方。
「Full-Color」视讯显示器的解析度是每个图素24 位元——8 位元红色、8位元绿色以及8 位元蓝色。
「High-Color」显示解析度是每个图素16 位元——5 位元红色、6 位元绿色以及5 位元蓝色。
Windows 98 支援的7 个画线函式是:
LineTo 画直线。
Polyline 和PolylineTo 画一系列相连的直线。
PolyPolyline 画多组相连的线。
Arc 画椭圆线。
PolyBezier 和PolyBezierTo 画贝塞尔曲线。
另外,Windows NT 还支援3 种画线函式:
ArcTo 和AngleArc 画椭圆线。
PolyDraw 画一系列相连的线以及贝塞尔曲线。
一些既画线也填入所画图形的封闭区域的函式,这些函式是:
Rectangle 画矩形。
Ellipse 画椭圆。
RoundRect 画带圆角的矩形。
Pie 画椭圆的一部分,使其看起来像一个扇形。
Chord 画椭圆的一部分,以呈弓形。
在画一系列相连的贝塞尔曲线时,只有当第一条贝塞尔曲线的第二个控制点、第一条贝塞尔曲线的终点(也就是第二条曲线的起点)和第二条贝塞尔曲线的第一个控制点线性相关时,也就是说这三个点在同一条直线上时,曲线在连接点处才是光滑的。
WINDOWS提供的三种现有画笔分别为:WHITE_PEN、BLACK_PEN、NULL_PEN
在任何时候,都只能有一种画笔选进装置内容。
当Windows 使用画笔来画线时,它实际上执行画笔图素与目标位置处原来图素之间的某种位元布林运算。图素间的位元布林运算叫做「位元映射运算」,
简称为「ROP」。由於画一条直线只涉及两种图素(画笔和目标),因此这种布林运算又称为「二元位元映射运算」,简记为「ROP2」。Windows 定义了16 种
ROP2 代码,表示Windows 组合画笔图素和目标图素的方式。
Windows 定义六种现有画刷:WHITE_BRUSH、LTGRAY_BRUSH、GRAY_BRUSH、DKGRAY_BRUSH、BLACK_BRUSH 和NULL_BRUSH (也叫HOLLOW_BRUSH)
画刷是一个8 8 的点阵图,它水平和垂直地重复使用来填入内部区域。
「映射方式」是一种几乎影响任何显示区域绘图的装置内容属性。另外有四种装置内容属性——视窗原点、视埠原点、视窗范围和视埠范围
在TextOut 中,以及在几乎所有GDI 函式中,这些座标值使用的都是一种「逻辑单位」。Windows 必须将逻辑单位转换为「装置单位」,即图素。这种转换是由映射方式、视窗和视埠的原点以及视窗和视埠的范围所控制的。映射方式还指示著x轴和y轴的方向(orientation);也就是说,它确定了当您在向显
示器的左或者右移动时x 的值是增大还是减小,以及在上下移动时y 的值是增大还是减小。
Windows定义了8种映射方式:
增加值
映射方式 逻辑单位 x值 y值
MM_TEXT 图素 右 下
MM_LOMETRIC 0.1 mm 右 上
MM_HIMETRIC 0.01 mm 右 上
MM_LOENGLISH 0.01 in. 右 上
MM_HIENGLISH 0.001 in. 右 上
MM_TWIPS 1/1440 in. 右 上
MM_ISOTROPIC 任意(x = y) 可选 可选
MM_ANISOTROPIC 任意(x != y) 可选 可选
MM_ISOTROPIC和MM_ANISOTROPIC。只有这两种映射方式可以让您改变视埠和视窗范围,也就是说可以改变Windows 用来转换逻辑和装置座标的换算因数
如果想要在使用任意的轴时都保证两个轴上的逻辑单位相同,则MM_ISOTROPIC 映射方式就是理想的映射方式。
在MM_ISOTROPIC 映射方式下设定视窗和视埠范围时,Windows 会调整范围,以便两条轴上的逻辑单位具有相同的实际尺度
Windows 对所有讯息(如WM_MOVE、WM_SIZE 和WM_MOUSEMOVE),对所有非GDI 函式,甚至对一些GDI 函式,永远使用装置座标。
三种装置坐标系:荧幕坐标、全视窗坐标、显示区域坐标系。
映射方式定义了Windows 如何将GDI 函式中指定的逻辑座标映射为装置座标,这里的装置座标系取决於您用哪个函式来取得装置内容。
映射方式用於定义从「视窗」(逻辑座标)到「视埠」(装置座标)的映射。
Windows包含五种以实际尺寸来表示逻辑座标的映射方式。
映射方式 逻辑单位 英寸 毫米
MM_LOENGLISH 0.01 in. 0.01 0.254
MM_LOMETRIC 0.1 mm. 0.00394 0.1
MM_HIENGLISH 0.001 in. 0.001 0.0254
MM_TWIPS 1/1400 in. 0.000694 0.0176
MM_HIMETRIC 0.01 mm. 0.000394 0.01
矩形函式:
FillRect (hdc, &rect, hBrush) ;用指定画刷来填入矩形(直到但不包含right和bottom 座标),该函式不需要先将画刷选进装置内容。
FrameRect (hdc, &rect, hBrush) ;使用画刷画矩形框,但是不填入矩形
InvertRect (hdc, &rect) ;将矩形中所有图素翻转
将矩形沿x 轴和y 轴移动几个单元 OffsetRect (&rect, x, y) ;
增减矩形的尺寸 InflateRect (&rect, x, y) ;
矩形各栏位设定为0 SetRectEmpty (&rect) ;
将矩形复制给另一个矩形 CopyRect (&DestRect, &SrcRect) ;
取得两个矩形的交集 IntersectRect (&DestRect, &SrcRect1, &SrcRect2) ;
取得两个矩形的联集 UnionRect (&DestRect, &SrcRect1, &SrcRect2) ;
确定矩形是否为空 bEmpty = IsRectEmpty (&rect) ;
确定点是否在矩形内 bInRect = PtInRect (&rect, point) ;
从伫列中删除WM_PAINT 讯息的唯一方法是令视窗显示区域的失效区域变得有效,这可以用ValidateRect 和ValidateRgn或者BeginPaint 和EndPaint 对来完成。
剪裁区域是对显示器上一个范围的描述,这个范围是矩形、多边形和椭圆的组合。剪裁区域可以用於绘制和剪裁,通过将剪裁区域选进装置内容,就可以用剪裁区域来进行剪裁(就是说,将可以绘图的范围限制为显示区域的一部分)。与画笔、画刷和点阵图一样,剪裁区域是GDI物件,您应该呼叫DeleteObject来删除您所建立的剪裁区域。