书籍:《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. 典型应用场景
- 文本排版计算:
通过tmHeight和tmAscent确定文本行高,避免重叠。TEXTMETRIC tm; GetTextMetrics(hdc, &tm); int lineHeight = tm.tmHeight + tm.tmExternalLeading; // 包含行间距[4](@ref) - 字体适配:
检查tmPitchAndFamily和tmCharSet,动态调整字体样式。 - 报表生成:
结合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(),开发者可实现精确的文本布局和跨平台兼容性适配。如需完整参数列表,可参考微软官方网页。


1086

被折叠的 条评论
为什么被折叠?



