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

设备上下文

设备上下文是一种包含有关某个设备(如显示器或打印机)的绘制属性信息的

Windows 数据结构。所有绘制调用都通过设备上下文对象进行,这些对象封装了

用于绘制线条、形状和文本的 Windows API。设备上下文允许在 Windows 中进

行与设备无关的绘制。设备上下文可用于绘制到屏幕、打印机或者图元文件。

CPaintDC 对象将 Windows 的常见固定用语进行封装,调用 BeginPaint 函

数,然后在设备上下文中绘制,最后调用 EndPaint 函数。CPaintDC 构造函数

为您调用 BeginPaint,析构函数则调用 EndPaint。该简化过程将创建 CDC 对

象、绘制和销毁 CDC 对象。在框架中,甚至连这个过程的大部分也是自动的。

具体说来,框架给 OnDraw 函数传递(通过 OnPrepareDC)准备好的 CPaintDC,

您只需绘制到 CPaintDC 中。根据调用 OnDraw 函数的返回,CPaintDC 被框架

销毁并且将基础设备上下文释放给 Windows。

CClientDC 对象封装对一个只表示窗口工作区的设备上下文的处理。

CClientDC 构造函数调用 GetDC 函数,析构函数调用 ReleaseDC 函数。

CWindowDC 对象封装表示整个窗口(包括其框架)的设备上下文。

CMetaFileDC 对象将绘制封装到 Windows 图元文件中。与传递给 OnDraw

的 CPaintDC 相反,在这种情况下您必须自己调用 OnPrepareDC。

设备上下文(Device Context)DC

DC实际上是GDI内部保存的数据结构。

DC与特定的显示设备(如显示器或打印机)相关。

对于显示器,DC总是与显示器上的特定视窗相关。

DC中的有些值是图形「属性」,这些属性定义了GDI绘图函数工作的细节。

例如,对於TextOut,DC的属性确定了文字的颜色、文字的背景色、x座标

和y座标映射到视窗的显示区域的方式,以及显示文字时Windows使用的字体。

MSDN的解释: 一个DC是一个结构,它定义了一系列图形对象的集合以及它

们相关的属性,以及影响输出效果的一些图形模式。这些图形对象包括一个画线

的笔,一个填充和 painting的画刷,一个用来向屏幕拷贝的位图,一个定义了

一系列颜色集合的调色板,一个用来剪裁等操作的区域,一个做painting和

drawing操作的路径。

SDK(Software Development Kit, 即软件开发工具包 )一般是一些被软件工程师用于为特定

的软件包、软件框架、硬件平台、操作系统等建立应用软件的开发工具的集合。

基本信息

SDK,Software Development Kit 的缩写,中文即“软件开发工具包”。广义上指辅助开

发某一类软件的相关文档、范例和工具的集合。

SDK是一些被软件工程师用于为特定的软件包、软件框架、硬件平台、操作系统等创

建应用软件的开发工具的集合,一般而言SDK即开发 Windows 平台下的应用程序所使用

的SDK。它可以简单的为某个程序设计语言提供应用程序接口 API 的一些文件,但也可能

包括能与某种嵌入式系统通讯的复杂的硬件。一般的工具包括用于调试和其他用途的实用工

具。SDK 还经常包括示例代码、支持性的技术注解或者其他的为基本参考资料澄清疑点的

支持文档。

为了鼓励开发者使用其系统或者语言,许多 SDK 是免费提供的。软件工程师通常从目

标系统开发者那里获得软件开发包,也可以直接从互联网下载,有时也被作为营销手段。例

如,营销公司会免费提供构件SDK 以鼓励人们使用它,从而会吸引更多人由于能免费为其

编程而购买其构件。

SDK 可能附带了使其不能在不兼容的许可证下开发软件的许可证。例如产品供应商提

供一个专有的SDK可能与自由软件开发抵触。GPL能使SDK与专有软件开发近乎不兼容。

LGPL下的SDK则没有这个问题。

API

API(Application Programming Interface)其实就是操作系统留给应用程序的一个调用

接口,应用程序通过调用操作系统的 API 而使操作系统去执行应用程序的命令(动作)。

其实早在 DOS 时代就有 API 的概念,只不过那个时候的 API 是以中断调用的形式(INT

21h)提供的,在 DOS 下跑的应用程序都直接或间接的通过中断调用来使用操作系统功能,

比如将 AH 置为 30h 后调用 INT 21h 就可以得到 DOS 操作系统的版本号。而在

Windows 中,系统 API 是以函数调用的方式提供的。同样是取得操作系统的版本号,在

Windows 中你所要做的就是调用 GetVersionEx() 函数。

可以这么说,DOS API 是“Thinking in 汇编语言”的,而 Windows API 则是“Thinking in

高级语言”的。

DOS API 是系统程序的一部分,他们与系统一同被载入内存并且可以通过中断矢量表

找到他们的入口,那么 Windows API 呢?要说明白这个问题就不得不引入我们下面要介绍

得这个概念——DLL。

DLL

DLL,即 Dynamic Link Library(动态链接库)。在windows环境下含有大量 .dll 格式

的文件,这些文件就是动态链接库文件,其实也是一种可执行文件格式。跟 .exe 文件不同

的是,.dll 文件不能直接执行,他们通常由 .exe 在执行时装入,内含有一些资源以及可执

行代码等。其实 Windows 的三大模块就是以 DLL 的形式提供的(,,

),里面就含有了 API 函数的执行代码。为了使用 DLL 中的 API 函数, 必须

要有 API 函数的声明(.H)和其导入库(.LIB),导入库可以先这样理解:导入库是为了在

DLL 中找到 API 的入口点而使用的。

为了使用 API 函数,我们就要有跟 API 所对应的 .H 和 .LIB 文件,而 SDK 正是

提供了一整套开发 Windows 应用程序所需的相关文件、范例和工具的“工具包”。

SDK 包含了使用 API 的必需资料,所以人们也常把仅使用 API 来编写 Windows 应

用程序的开发方式叫做“SDK 编程”。而 API 和 SDK 是开发 Windows 应用程序所必需的

东西,所以其它编程框架和类库都是建立在它们之上的,比如 VCL 和 MFC,虽然他们比

起“SDK 编程”来有着更高的抽象度,但这丝毫不妨碍它们在需要的时候随时直接调用 API

函数