CreateFontIndirect和控制面板缩放系数

时间:2017-09-06 20:46:50

标签: windows winapi visual-c++

我填写LOGFONT结构并使用CreateFontIndirect()创建字体并用它绘制一段文字。这是在Windows 7上,所以我们不要讨论高动态DPI感知或其在Windows 10上调用的任何内容。

将控制面板设置为100%默认缩放系数,我绘制的文字看起来很像。如果将控制面板缩放系数更改为125%或150%,会发生什么?我曾经期望在重新绘制/重新登录/重启之后绘制的文本看起来会稍微大一点,而我不必在程序上做任何事情。但事实并非如此。无论缩放因子大小如何,文本都保持完全相同。我做错了什么?

我的字体高度已硬编码为-7

我猜这同样适用于按钮尺寸。如果我在运行中以程序方式计算按钮大小,并且按钮在100%时看起来没问题,我是否应该在以125%显示它们时进行额外的计算?它们看起来完全一样。

1 个答案:

答案 0 :(得分:1)

对负值进行硬编码可以得到:

  

字体映射器将此值转换为设备单位和匹配项   它的绝对值与可用的字符高度有关   字体。

如果你查看CreateFont的文档,你会发现这个公式

nHeight = -MulDiv(PointSize, GetDeviceCaps(hDC, LOGPIXELSY), 72);

和LOGPIXELSY基本上得到DPI,一英寸包含72点。如果您需要特定的字体磅值,则应使用此公式。

这是经典的做事方式,并且一直存在。在Vista之前,点大小通常为8,但您应该从系统/主题API获取它。在支持文章中也有documented here,其中包含更多详细信息。您还可以通过询问NONCLIENTMETRICS来获取系统使用的LOGFONT

This blog post包含有关Microsoft必须采取哪些操作来修复记事本才能使每个监视器支持DPI的信息。

对话框中的UI元素应基于对话框单元。对话框单位因字体而异,但可以转换为MapDialogRect的像素。