根据MSDN 文档EnumFontFamiliesEx
,该函数的第一个参数描述为:
hdc [in]
设备上下文句柄,从中枚举字体。
- 它到底是什么意思?
- 设备上下文是什么意思?
- 为什么设备上下文应该与字体相关?
问题(3)是一件很难找到解释的事情,但原因很简单:
一些设备提供自己的字体支持。例如,PostScript 打印机将允许您使用 PostScript 字体。但是在屏幕上渲染时,这些相同的字体将无法使用,或者在没有 PostScript 支持的情况下渲染到另一台打印机。另一个例子是绘图仪(它是电动笔)需要具有固定笔画粗细的矢量字体,因此光栅字体不能与此类设备一起使用。
如果您对特定于设备的字体支持感兴趣,您会想了解该GetDeviceCaps
功能。
微软还有其他关于设备上下文的文章,
https://docs.microsoft.com/en-us/windows/win32/gdi/about-device-contexts
应用程序必须通知 GDI 加载特定的设备驱动程序,并且在加载驱动程序后,准备设备进行绘图操作(例如选择线条颜色和宽度、画笔图案和颜色、字体、剪辑区域、等等)。这些任务是通过创建和维护设备上下文 (DC) 来完成的。DC 是一种结构,它定义了一组图形对象及其相关属性,以及影响输出的图形模式。图形对象包括用于画线的笔、用于绘画和填充的画笔、用于复制或滚动屏幕部分的位图、用于定义可用颜色集的调色板、用于剪切和其他操作的区域以及用于绘画和绘图操作。与大多数结构不同,应用程序永远无法直接访问 DC;相反,它通过调用各种函数间接地对结构进行操作。
显然字体是一种绘图。
Windows API 广泛使用句柄的概念。句柄是一个整数值,您可以将其用作访问 API 资源的令牌。您可以将其视为一种“this”指针,尽管它绝对不是指针。
设备上下文是 Windows API 中的一个对象,它表示您可以在其上绘制或显示图形的东西。它可能是一台打印机、一张位图或一个屏幕,或其他一些在其中创建图形有意义的环境。在 Windows 中,必须先将字体选择到设备上下文中,然后才能使用它们。为了找出任何给定设备上下文中当前可用的字体,您可以枚举它们。这就是 EnumFontFamiliesEx 的用武之地。