说说我们的老伙计:GetDialogBaseUnits
我们
2023-09-14 09:10:45 时间
转换DLU到像素
如果你想将对话框单元(DLU)转换为像素,通常我们有两个选择。
第一种是使用API GetDialogBaseUnits。这个API会直接返回基本单元的值(所以,你还需要做一些额外的计算)。
另一个则是使用MapDialogRect。这个API会需要你传入DLU的值并返回一个以像素为单位的矩形。
那么,它们两个有什么区别呢?
也许从本文的标题,你就应该可以看出来。GetDialogBaseUnits实际上没有什么用。
因为我们从它的函数原型可以看出:它没有携带一个指定对话框的窗口句柄,所以在它的内部实现中,它并不知道要获取哪个对话框的DLU。所以,它会尝试猜测。是的,没错,猜测,老兄。
而且,更糟糕的是,这种猜测算法总是错误的。
GetDialogBaseUnits会返回使用默认系统字体的对话框的DLU。但是,现如今,大家都不使用这个默认的系统字体在自己的对话框上,而是使用自定义的字体,例如”MS Sans Serif 8″,或者”Tahoma”,如果他们是时髦的Windows 2000用户的话。
由于兼容性的历史原因,Microsoft保留了GetDialogBaseUnits这个API。
总是这样做
这就是你为什么必须使用MapDialogRect的原因,因为它会接收一个对话框窗口句柄并使用正确的对话框字体来进行计算。
总结
Windows的兼容性做得好,我们都喜欢。
付出的代价是:Win32 SDK内部充满了各种不能删除的老伙计们。
最后
Raymond Chen的《The Old New Thing》是我非常喜欢的博客之一,里面有很多关于Windows的小知识,对于广大Windows平台开发者来说,确实十分有帮助。
本文来自:《GetDialogBaseUnits is a crock》
相关文章
- 这些特效对于学习前端我们很有用
- 【一】设计一个类,我们只能生成该类的一个实例。
- 当我们在UI上点add button增加新的search criteria之后,是framework做的处理把新的row render出来
- L1-052 2018我们要赢 (5 分)—团体程序设计天梯赛
- 掌握高性能计算前,我们先了解一下它的历史
- 想了解任务型对话机器人,我们先从自然语言理解聊起
- 我们需要点钝感力
- 【蓝桥真题7】贴吧车队作弊?应对线上考和双填趋势,我们该如何备考?
- 抖音APP告诉我们什么叫真正的性能优化天花板
- 为了让大家更好地学习python爬虫,我们做了一个“靶子”
- RD Client 苹果手机APP由于内部错误 我们无法连接到远程网关,错误0x3000064