如何获取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
相关产品推荐
相关产品推荐

