You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何获取GDI字体参数,生成两倍大小/字重的现有字体版本?

提取现有字体参数生成变体字体的方案

你提到的问题可以通过GetObject API直接获取现有字体的LOGFONTA结构,不用仅依赖GetTextMetrics。具体步骤如下:

  • 第一步:获取当前HDC中正在使用的字体句柄
    用GetCurrentObject函数传入HDC和OBJ_FONT参数,得到当前字体的HFONT句柄。

  • 第二步:从字体句柄提取LOGFONTA结构
    调用GetObject,传入字体句柄、LOGFONTA的大小以及LOGFONTA变量的地址,就能完整获取该字体的创建参数,这比GetTextMetrics返回的信息全面得多。

  • 第三步:修改目标参数生成新字体
    根据需求修改LOGFONTA中的对应字段:

    • 两倍大小:将lfHeight字段的值乘以2(注意保留原符号,负数表示以字符高度为准,忽略内部行距)
    • 两倍字重:将lfWeight字段的值乘以2,注意不能超过1000的上限(比如原字重是400(FW_NORMAL),修改后为800(FW_EXTRABOLD))
  • 第四步:用修改后的LOGFONTA创建新字体
    调用CreateFontIndirectA传入修改后的结构,即可生成所需的变体字体。

示例代码

#include <windows.h>

HFONT GetScaledFont(HDC hdc, BOOL bDoubleSize, BOOL bDoubleWeight)
{
    // 获取当前字体句柄
    HFONT hCurrentFont = (HFONT)GetCurrentObject(hdc, OBJ_FONT);
    if (!hCurrentFont) return NULL;

    LOGFONTA lf = {0};
    // 提取LOGFONTA结构
    if (GetObject(hCurrentFont, sizeof(LOGFONTA), &lf) == 0)
        return NULL;

    // 修改参数
    if (bDoubleSize)
    {
        // 保留符号,确保字体高度的逻辑正确
        lf.lfHeight *= 2;
    }

    if (bDoubleWeight)
    {
        lf.lfWeight *= 2;
        // 确保字重不超过最大值1000
        if (lf.lfWeight > FW_HEAVY)
            lf.lfWeight = FW_HEAVY;
    }

    // 创建新字体
    return CreateFontIndirectA(&lf);
}

注意事项

  • lfHeight的符号很重要:负数表示指定字符的高度(不含内部行距),正数表示指定字符的单元格高度(含内部行距),修改时务必保留原符号。
  • 字重的范围是0到1000,标准值包括FW_NORMAL(400)、FW_BOLD(700)、FW_EXTRABOLD(800)、FW_HEAVY(900)等,超出范围会被系统自动调整。
  • 使用完新字体后记得调用DeleteObject释放资源,避免内存泄漏。

内容的提问来源于stack exchange,提问作者odo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 13:26:10