zl程序教程

您现在的位置是:首页 >  其它

当前栏目

说说我们的老伙计: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》