获取GDI字体参数

问题描述 投票:0回答:1

要通过

CreateFontA
CreateFontIndirectA
创建新字体,需要很多参数。如何提取这些参数来制作现有字体的“两倍大”或“两倍粗细”版本?

我没有看到等效的 API 可以返回现有字体的

LOGFONTA
结构。一些参数可以通过
GetTextMetrics
获得,但不是全部。

windows winapi gdi
1个回答
0
投票

CreateFont 和 CreateFontIndirect 返回的 HFONT 是对对象的引用,该对象保存在创建它的调用中指定的原始参数。

您可以使用 GetObject 将这些值返回到 LOGFONT 中。

// If you have an HFONT called hfont, ...
LOGFONTA lf;
if (GetObject(hfont, sizeof(lf), &lf)) {
    // The LOGFONT lf is now filled out with the same parameters
    // specified when the HFONT was created.  Many of those may
    // be 0 or default.
}

(通常我会使用 API 的宽 (-W) 版本,但您特别要求使用 ANSI (-A) 版本,所以我在这些示例中这样做了。)

字体的实际选择被推迟,直到字体对象(由 HFONT 引用)被选择到设备上下文中。 字体映射器查看指定的参数,并尝试从可用字体中找到该设备上下文的最佳匹配。

因此,要找到所选字体的实际大小和功能,您需要将字体选择到设备上下文(或信息上下文)中,并使用函数来检索文本指标或测量特定字符串的大小。

// If you have an HFONT hfont and an HDC hdc, ...
HGDIOBJ hfontOriginal = SelectObject(hdc, hfont);
TEXTMETRICSA tm;
if (GetTextMetricsA(hdc, &tm)) {
    // The structure tm is now filled out with size
    // information about the selected font.  The
    // measurements are in device units.
}
char face[LF_FACESIZE] = "";
if (GetTextFaceA(hdc, ARRAYSIZE(face), face)) {
    // face is now a zero-terminated string with the
    // typeface name.  This is the version of the name
    // that you could use in a LOGFONT'S lfFaceName field.
}

您可以通过使用 API 获取轮廓文本指标(如果是 TrueType 或 OpenType 字体)来获取有关所选实际字体的更多信息。

© www.soinside.com 2019 - 2024. All rights reserved.