详细介绍GetTextMetrics()

书籍:《Visual C++ 2017从入门到精通》的2.5键盘

环境:visual studio 2022

内容:【例2.43】通过字符消息显示用户按键的字符

说明:以下内容大部分来自腾讯元宝。

GetTextMetrics() 是 Windows GDI(图形设备接口)中用于获取当前选定字体度量信息的函数,其核心功能是通过设备上下文(DC)获取字体的物理属性,以便进行精确的文本布局和渲染。以下是详细说明:


1. 函数功能与参数

  • 功能
    将当前设备上下文(DC)中选定字体的度量信息填充到 TEXTMETRIC 结构体中,包括字符高度、宽度、间距等参数。
  • 参数
    • hdc(设备上下文句柄):指定需要查询的字体环境
    • lptm(指向 TEXTMETRIC 结构的指针):接收字体度量数据的缓冲区。

2. TEXTMETRIC 结构详解

TEXTMETRIC 结构包含以下关键成员(所有值以逻辑单位表示,依赖当前映射模式):

成员名称含义示例应用场景
tmHeight字符总高度(上升+下降)计算文本行高
tmAscent字符上升高度(基线以上)排版对齐基线
tmDescent字符下降高度(基线以下)避免文本重叠
tmAveCharWidth平均字符宽度(如字母 'x' 的宽度)估算文本宽度
tmMaxCharWidth最宽字符宽度(如 'W' 或 'M')确定容器宽度
tmPitchAndFamily字体间距和字体族(如 FF_DONTCARE 或 FF_ROMAN字体样式适配
tmCharSet字符集(如 ANSI_CHARSET 或 SYMBOL_CHARSET多语言支持

3. 返回值与错误处理

  • 返回值
    • 成功:返回非零值。
    • 失败:返回 0,可通过 GetLastError() 获取详细错误。
  • 注意事项
    • 需先通过 SelectObject() 选定有效字体到 DC,否则可能获取到默认系统字体(如位图字体)。
    • Unicode 版本为 GetTextMetricsW,需包含 wingdi.h 并链接 gdi32.lib

4. 典型应用场景

  1. 文本排版计算
    通过 tmHeight 和 tmAscent 确定文本行高,避免重叠。
    TEXTMETRIC tm;
    GetTextMetrics(hdc, &tm);
    int lineHeight = tm.tmHeight + tm.tmExternalLeading; // 包含行间距[4](@ref)
  2. 字体适配
    检查 tmPitchAndFamily 和 tmCharSet,动态调整字体样式。
  3. 报表生成
    结合 GetTextExtentPoint32 计算字符串实际显示宽度,优化布局。

5. 示例代码

#include <windows.h>

void GetFontMetricsExample(HDC hdc) {
    TEXTMETRIC tm;
    if (GetTextMetrics(hdc, &tm)) {
        // 输出字体信息
        std::cout << "字符高度: " << tm.tmHeight << std::endl;
        std::cout << "平均字符宽度: " << tm.tmAveCharWidth << std::endl;
    } else {
        // 错误处理
        DWORD error = GetLastError();
        // ...
    }
}

引用来源

  • 函数功能与参数:

  • TEXTMETRIC 结构详解:

  • 错误处理与 Unicode 版本:

  • 应用场景示例:

    通过合理使用 GetTextMetrics(),开发者可实现精确的文本布局和跨平台兼容性适配。如需完整参数列表,可参考微软官方网页。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值