在 Windows GDI 中,您可以创建设备上下文并在其中选择字体,而无需窗口句柄。例如。,
HDC hdc = CreateDC(L"DISPLAY", NULL, NULL, NULL);
//CreateCompatibleDC(NULL) also works
HFONT hFont = CreateFont(
-20, 0, 0, 0,
FW_REGULAR,
FALSE, FALSE, FALSE, DEFAULT_CHARSET,
OUT_DEFAULT_PRECIS,
CLIP_DEFAULT_PRECIS,
DEFAULT_QUALITY,
DEFAULT_PITCH || FF_DONTCARE,
L"Arial"
);
HFONT oldFont = static_cast<HFONT>(SelectObject(hdc, hFont));
请注意,GDI 文本函数使用 UTF-16 编码,并且所有这些函数都是在 Unicode 分配任何补充平面字符之前创建的。因此,获取或返回非字符串字符列表的函数(例如 GetFontUnicodeRanges)对于当今的大部分 Unicode 都不能很好地工作。获取字体Unicode范围 https://learn.microsoft.com/en-us/windows/win32/api/wingdi/nf-wingdi-getfontunicoderanges返回一个指向 a 的指针GLYPHSET https://learn.microsoft.com/en-us/windows/win32/api/wingdi/ns-wingdi-glyphset,其中有一个数组WCRANGE https://learn.microsoft.com/en-us/windows/win32/api/wingdi/ns-wingdi-wcrange结构。它有一个 WCHAR 来表示一个 Unicode 字符。因此,GetFontUnicodeRanges 无法报告任何 Unicode 补充平面字符。在某些字体中,这可能是字体中支持的大多数字符。
从这一点来看,GDI 不仅古老,而且已经过时。对于您正在做的事情,DirectWrite 是一个更好的选择:它的所有 API 都支持所有 Unicode 字符。
你想要的 DWrite 方法是IDWriteFontFace1::GetUnicodeRanges https://learn.microsoft.com/en-us/windows/win32/api/dwrite_1/nf-dwrite_1-idwritefontface1-getunicoderanges。许多 DWrite API(包括此 API)都可以在没有窗口甚至设备上下文的情况下使用。您可能希望通过调用来获取 IDWriteFontFace1 对象IDWriteFont::CreateFontFace https://learn.microsoft.com/en-gb/windows/win32/api/dwrite/nf-dwrite-idwritefont-createfontface, IDWriteFactory::CreateFontFace https://learn.microsoft.com/en-us/windows/win32/api/dwrite/nf-dwrite-idwritefactory-createfontface or IDWriteFontFaceReference::CreateFontFace https://learn.microsoft.com/en-us/windows/win32/api/dwrite_3/nf-dwrite_3-idwritefontfacereference-createfontface根据您感兴趣的字体的来源,可以是已安装的字体、自定义字体集、内存 blob 或字体文件。