Windows CreateFontIndirect和控制面板缩放因子

Windows CreateFontIndirect和控制面板缩放因子,windows,winapi,visual-c++,Windows,Winapi,Visual C++,我填写一个LOGFONT结构,并使用CreateFontIndirect()创建一个字体并用它绘制一段文本。这是在Windows7上,所以我们不要讨论高动态DPI感知或Windows10上的任何名称 将“控制面板”设置为100%默认缩放因子时,我绘制的文本外观与它的外观相同。如果我将控制面板缩放因子更改为125%或150%,会发生什么情况?我原以为在重新绘制/重新登录/重新启动后绘制的文本看起来会稍大一些,而无需我进行任何编程。但事实并非如此。无论缩放因子大小如何,文本都保持完全相同。我做错了什

我填写一个
LOGFONT
结构,并使用
CreateFontIndirect()
创建一个字体并用它绘制一段文本。这是在Windows7上,所以我们不要讨论高动态DPI感知或Windows10上的任何名称

将“控制面板”设置为100%默认缩放因子时,我绘制的文本外观与它的外观相同。如果我将控制面板缩放因子更改为125%或150%,会发生什么情况?我原以为在重新绘制/重新登录/重新启动后绘制的文本看起来会稍大一些,而无需我进行任何编程。但事实并非如此。无论缩放因子大小如何,文本都保持完全相同。我做错了什么

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


我想这同样适用于纽扣尺寸。如果我在运行中通过编程计算出按钮的大小,并且按钮看起来100%正常,那么当以125%显示它们时,我应该做额外的计算吗?它们看起来完全一样,大小不变。

对负值进行硬编码可以提供:

字体映射器将此值转换为设备单位并匹配 它相对于可用字符高度的绝对值 字体

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

nHeight = -MulDiv(PointSize, GetDeviceCaps(hDC, LOGPIXELSY), 72);
LOGPIXELSY基本上得到了DPI,一英寸包含72个点。如果需要特定的字体点大小,则应使用此公式

这是一种经典的做事方式,并且一直存在。在Vista之前,点大小通常为8,但您应该从system/theme API获得它。还有一篇支持文章提供了更多详细信息。您还可以通过请求获取系统使用的
LOGFONT
s

包含有关Microsoft如何将记事本修复为支持每监视器DPI的信息


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

不要描述您的代码。是的,我看到了公式和文档——使用它时产生的结果文本看起来非常糟糕。我不认为它能像预期的那样工作。你可以找到一些Win10 DPI之前的文档@你可以像他们那样使用比例因子,或者如果你真的想要更大的字体,只需要使用更大的值。如果深渊意味着模糊,那么你还没有将自己标记为DPI意识。