2024年4月5日发(作者:)

要想在屏幕或者其它输出设备上输出图形或者文字,那么我们就必须先获得一个称为设备描述表

( DC:Device Context)的对象的句柄,以它为参数,调用各种GDI函数实现各种文字或图形的输出。设备

描述表是GDI内部保存数据的一种数据结构,此结构中的属性内容与特定的输出设备(显示器,打印机等)

相关,属性定义了GDI函数的工作细节,在这里属性确定了文字的颜色,x坐标和y坐标映射到窗口显示

区域的方式等。

设备描述表句柄一旦获得,那么系统将使用默认的属性值填充设备描述表结构。

如果有必要,我们可以使用一些GDI函数获取和改变设备描述表中的属性值。

设备描述表概述

当一个应用程序使用GDI函数时,必须先装入特定的设备驱动程序,然后为绘制窗口准备设备描述表,比

如指定线的宽度和颜色、刷子的样式和颜色、字体、剪裁区域等等。不像其他Win32结构,设备描述表不

能被直接访问,只能通过系列Win32函数来间接地操作。

如同Windows“窗口类”一样,设备描述表也是一种Windows数据结构,用来描述绘制窗口所需要的信息。

它定义了一个坐标映射模式、一组GDI图形对象及其属性。这些GDI对象包括用于画线的笔,绘图、填图

的刷子,位图,调色板,剪裁区域,及路径(Path)。

表2-2列出了设备描述表的结构和各项缺省值,表2-3列出了设备描述表的类型,表2-4显示设备描述表的

类型。

表2-2 设备描述表的结构

属性

缺省值

Background color

Background color setting from Windows Control Panel (typically, white)

Background mode

OPAQUE

Bitmap

None

Brush

WHITE_BRUSH

Brush origin

(0,0)

Clipping region

Entire window or client area with the update region clipped, as appropriate. Child and pop-up windows in the clie

nt area may also be clipped

Palette

DEFAULT_PALETTE

Current pen position

(0,0)

Device origin

Upper left corner of the window or the client area

Drawing mode

R2_COPYPEN

Font

SYSTEM_FONT (SYSTEM_FIXED_FONT for applications written to run with Windows versions 3.0 and earlie

r)

Intercharacter spacing

0

Mapping mode

MM_TEXT

Pen

BLACK_PEN

Polygon-fill mode

ALTERNATE

Stretch mode

BLACKONWHITE

Text color

Text color setting from Control Panel (typically, black)

Viewport extent

(1,1)

Viewport origin

(0,0)

Window extent

(1,1)

Window origin

(0,0)

表2-3 设备描述表的分类

Display

显示设备描述表,提供对视频显示设备上的绘制操作的支持

Printer

打印设备描述表,提供对打印机、绘图仪设备上的绘制操作的支持

Memory

内存设备描述表,提供对位图操作的支持

Information

信息设备描述表,提供对操作设备信息获取的支持

表2-3中的显示设备描述表又分三种类型,如表2-4所示。

表2-4 显示设备描述表的分类

名称

特点

功能

Class Device

Contexts

提供对Win16的向后兼容

Common

Device

Contexts

在Windows系统的高速缓冲区,数量有限

Applicaion获取设备描述表时,Windows用缺省值初始化该设备描述表,Application使用它完成绘制操作,

然后释放

Private

Device

Contexts

没有数量限制,用完不需释放一次获取,多次使用

多次使用过程中,每次设备描述表属性的任何修改或变化都会被保存,以支持快速绘制

(1)使用设备描述表的步骤

要使用设备描述表,一般有如下步骤:

获取或者创建设备描述表;

必要的话,改变设备描述表的属性;

使用设备描述表完成绘制操作;

释放或删除设备描述表。

Common设备描述表通过::GetDC,::GetDCEx,::BeginPaint来获得一个设备描述表,用毕,用::ReleaseDC

或::EndPaint释放设备描述表;

Printer设备描述表通过::CreateDC创建设备描述表,用::DeleteDC删除设备描述表。

Memory设备描述表通过::CreateCompatibleDC创建设备描述表,用::DeleteDC删除。

Information设备描述表通过::CreateIC创建设备描述表,用::DeleteDC删除。

(2)改变设备描述表属性的途径

要改变设备描述表的属性,可通过以下途径:

用::SelectObject选入新的除调色板以外的GDI Object到设备描述表中;

对于调色板,使用::SelectPalette函数选入逻辑调色板,并使用::RealizePalette把逻辑调色板的入口映射到物

理调色板中。

用其他API函数改变其他属性,如::SetMapMode改变映射模式。

设备 上下文 句柄

Device Context Handle

一共3个概念,2个设计理念

句柄,一般是一个索引,通过它得到实际的struct

设备,就是普通设备,比如显示器,打印机

设备上下文,简单理解为一个struct,里面有颜色,画笔粗细,字体,等信息

决定你在这个设备上画出来的效果

句柄是一个封装常用的设计方法

把各种设备抽象为一个统一的设备也是一个常用的设计方法