要通过
CreateFontA
或 CreateFontIndirectA
创建新字体,需要很多参数。如何提取这些参数来制作现有字体的“两倍大”或“两倍粗细”版本?
我没有看到等效的 API 可以返回现有字体的
LOGFONTA
结构。一些参数可以通过GetTextMetrics
获得,但不是全部。
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 字体)来获取有关所选实际字体的更多信息。