蛋疼好久了,TEXTMETRIC和LOGFONT的区别

南郊居士 2014-05-16 04:02:49
写了一个文字处理控件,需要知道字符的宽和高,我用如下代码进行测试:
...
HDC dc = ::GetDC(this->m_hWnd) ;
LOGFONT logfont ;
GetFont()->GetLogFont(&logfont) ; // 用断点查看logfont的值
HGDIOBJ hOldObj = SelectObject(dc, GetFont()) ;

TEXTMETRIC tm ;
GetTextMetrics(dc, &tm) ; // 用断点查看tm的值

DeleteObject(SelectObject(dc, hOldObj)) ;
::ReleaseDC(this->m_hWnd, dc) ;
...

最后看到的结果令我想不明白:
tm.tmHeight = 16
tm.tmAveCharWidth = 7
tm.tmWeight = 700

logfont.lfHeight = -12
logfont.lfWidth = 0
logfont.lfWeight = 400
logfont.lfFaceName = "宋体"

我猜测TEXTMETRIC得到的字体信息可能是SYSTEM_FONT的字体信息,而LOGFONT的信息则是当前控件的字体信息,二者差别明显。可是我已经把当前控件字体的信息选入dc中了,最后得到的TEXTMETRIC仍然是系统内定的大小。

由于LOGFONT中的Width是0,所以我无法从LOGFONT中获得字体宽度,那么请问各位前辈应该如何确定字体宽度。
...全文
294 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
南郊居士 2014-05-20
  • 打赏
  • 举报
回复
引用 4 楼 zzz3265 的回复:
HGDIOBJ hOldObj = SelectObject(dc, GetFont()) ; 这句代码执行失败, 编译器会把 CFont * 强制转换成 HGDIOBJ, 编译器有点傻 SelectObject(dc, GetFont()->GetSafeHandle()) ; 改成这样就好了
正解!!!
schlafenhamster 2014-05-17
  • 打赏
  • 举报
回复
GetTextMetrics(dc, &tm) ; // 是使用DC 中的 font 来得到 tm 信息 但可能有 '近似' 的过程
Yofoo 2014-05-17
  • 打赏
  • 举报
回复
HGDIOBJ hOldObj = SelectObject(dc, GetFont()) ; 这句代码执行失败, 编译器会把 CFont * 强制转换成 HGDIOBJ, 编译器有点傻 SelectObject(dc, GetFont()->GetSafeHandle()) ; 改成这样就好了
schlafenhamster 2014-05-16
  • 打赏
  • 举报
回复
TEXTMETRIC tm ; GetTextMetrics(dc, &tm) ; // 是使用DC 中的 font 来得到 tm 信息
南郊居士 2014-05-16
  • 打赏
  • 举报
回复
引用 1 楼 schlafenhamster 的回复:
好像不要 : GetFont()->GetLogFont(&logfont) ; // 用断点查看logfont的值
何解?您的意思是这个东西没用? 但是我用
::GetObject(GetStockObject(SYSTEM_FONT), sizeof(LOGFONT), logfont) ;
来获得的字体,和上面GetTextMetrics得到的TEXTMETRIC的值非常接近 logfont.lfHeight = 16 logfont.lfWidth = 7 logfont.lfWeight = 700 logfont.lfFaceName = "System" 我是XP系统
schlafenhamster 2014-05-16
  • 打赏
  • 举报
回复
好像不要 : GetFont()->GetLogFont(&logfont) ; // 用断点查看logfont的值

15,979

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧