Windows应用程序 - DPI问题

5
我们目前的一个Win32 MFC应用程序存在问题,无法在使用高dpi设置的显示器上正确渲染。具体来说,在选择了120 dpi的Windows XP中,应用程序中有几个地方的文本会放大,但其容器不会跟随放大(例如文本溢出其按钮边界等)。当选择了“使用XP样式DPI缩放”时,Windows 7(和Vista)也会发生这种情况,而且dpi>96时也是如此。如果未选择XP样式缩放,则我了解Win7将使用DPI虚拟化。使用DPI虚拟化时一切看起来都很正常(虽然有些模糊但至少是正确的)。在Win7中,默认情况下,120 dpi使用xp样式缩放,下一个设置(144 dpi)则不使用。因此,我们的应用程序在144 dpi下看起来正确,但在120 dpi下错误。
如果我编辑应用程序清单以声明应用程序为“DPI感知”,则会关闭DPI虚拟化(但不关闭XP样式DPI缩放),这对我没有任何帮助。事情仍然看起来非常糟糕(120 dpi没有变化,144 dpi现在已经崩溃)。
我需要解决这个问题,我尝试阅读了关于DPI /缩放问题的一般信息,这是一次学习经历。到目前为止,我还没有找到合适的解决方案。目前我没有打算进行彻底且正确的修复(应用程序根据dpi正确缩放所有元素)。那将涉及大量重写。我认为有两种可能的解决方案。一种是完全关闭任何形式的DPI缩放。这意味着如果用户的Win7系统设置为120 dpi,则其系统中的所有内容都会看起来很好/大,但我们的应用程序将看起来正确但与其他应用程序中的所有内容相比较小。第二个解决方案是在某种程度上强制我们的应用程序使用DPI虚拟化,但永远不要使用XP样式DPI缩放。我希望这是一个应用程序端的更改,而不是依赖于最终用户进行Windows配置更改。
到目前为止,我还没有找到实现任何解决方案的方法。请求了解更多相关知识的人能够回复并指引我正确的方向吗?
谢谢。

1
问题出在你的布局代码还是绘图代码中?例如,问题是你正在制作按钮和其他标准控件的x乘y像素,还是你有绘制自己控件的代码(例如使用GDI调用)具有固定大小?你是如何进行布局的?表单?对话框模板?自定义代码? - Adrian McCarthy
这里没有什么魔法,你只需要将窗口变大或者字体变小,自行选择。 - Hans Passant
1个回答

2
您无法强制使用120 DPI设置的DPI虚拟化。我为一个产品调查过这个问题,因为在高DPI下模糊的外观看起来是一个很好的权衡。
最终,我们对UI定位和缩放进行了全面重写,以便它可以与高DPI设置中的字体缩放正确地缩放。客户端现在完全支持DPI并可以在任何DPI设置下正确缩放。
在我们的情况下,为了做到这一点,需要一个人花费约3个月的时间对复杂的客户端进行全面的改造。
我们有一个未尝试过但可能适合您的备选方案:在启动时读取操作系统的DPI缩放系数。然后将您拥有的所有字体实例都减少这个因素,以便当Windows再次缩放字体时,它们回到UI可以适应它们的大小。当然,在高DPI设置下的用户将不会在您的应用程序中获得更大的字体,但至少可以使用。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接