蛋疼好久了,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中获得字体宽度,那么请问各位前辈应该如何确定字体宽度。
...全文
390 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的值
内容概要:本文提出了一种考虑不同充电需求的电动汽车有序充电调度方法,并提供了完整的Matlab代码实现。该方法针对大规模电动汽车接入电网带来的负荷压力问题,综合考虑用户的多样化充电需求(如充电起始时间、期望电量、最迟离网时间等),构建了以削峰填谷、降低电网运行成本、提高电能利用效率为目标的优化调度模型。通过引入智能优化算法,实现了充电负荷在时间和空间上的合理重分配。文中详细阐述了模型的设计思路、目标函数构建、约束条件设定,并通过仿真实验验证了所提方法在改善电网负荷曲线、减少用电成本及提升用户满意度方面的有效性与先进性。; 适合人群:电气工程、自动化、能源系统等相关专业的研究生、科研人员及从事智能电网、电动汽车充电管理的技术工程师;具备一定Matlab编程能力与优化理论基础的开发者。; 使用场景及目标:①研究大规模电动汽车接入对配电网负荷特性的影响及调控策略;②开发面向实际应用的有序充电调度系统原型;③对比分析不同优化算法在充电调度问题中的收敛性与求解效率;④支撑高水平学术论文撰写或科研项目成果展示。; 阅读建议:此资源以Matlab为实现平台,强调理论建模与编程实践深度融合,建议读者在学习过程中重点理解调度模型的数学表达与物理意义,结合所提供的代码进行调试、复现与拓展,深入掌握有序充电调度的核心机制与工程实现路径。

15,976

社区成员

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

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