Windows应用程序 - DPI问题

时间:2011-11-03 18:28:53

标签: windows mfc dpi

我们现有的基于Win32 MFC的应用程序存在问题。它在使用高dpi设置的显示器上无法正确呈现。更具体地说,在选择了120 dpi的Windows XP中,应用程序中有几个地方可以放大文本但不是它们的容器(文本溢出它的按钮边界等)。当选择> 96 dpi并选择“使用XP风格dpi缩放”时,Windows 7(和Vista)中也会出现这种情况。如果没有选择xp样式缩放,那么我理解Win7使用DPI虚拟化。使用DPI虚拟化时,一切看起来都很好(好的东西很模糊,但至少它们是正确的)。默认情况下,Win7 120 dpi使用xp样式缩放,而下一个设置(144 dpi)则不然。所以我们的应用程序在144 dpi看起来是正确的,但在120 dpi时是错误的。

如果我编辑应用程序清单以将应用程序声明为“DPI aware”,那么这将改变DPI虚拟化(但不是XP风格的dpi缩放),这让我无处可去。事情看起来仍然很糟糕(120 dpi没有变化,144 dpi现已破坏)。

我需要解决这个问题并且我已经尝试过阅读DPI /扩展问题,这是一次学习经历。到目前为止,我还没有找到合适的解决方案。目前,我目前无意进行彻底和正确的修复(应用程序根据dpi正确地缩放所有元素)。这将涉及很多重写。我认为有两种可能的解决方案。一个是关闭任何类型的DPI缩放。这意味着如果用户Win7系统设置为120 dpi,那么他们系统上的所有内容都会看起来很好/很大,但我们的应用程序看起来不错,但与其他应用程序中的其他内容相比会很小。第二个解决方案是如何强制我们的应用程序使用DPI虚拟化,但永远不会使用XP风格的dpi缩放。我希望这是一个应用程序端更改,而不是依赖最终用户进行Windows配置更改。

到目前为止,我还没有找到解决问题的方法。

如果有人对此主题有更多的了解,请回复并指出我的正确方法吗?

由于

1 个答案:

答案 0 :(得分:2)

您无法在120 DPI设置上强制使用DPI虚拟化。我自己对这个产品进行了调查,因为在高DPI中看起来很模糊,这似乎是一个很好的权衡。

我们最终完全重写了UI定位和缩放,以便在高DPI设置中使用字体缩放来正确缩放。客户端现在可以完全识别DPI并在任何DPI设置中正确扩展。

在我们的案例中,为了一个相当复杂的客户,正确地完成这项工作需要花费3个月的时间。

我们有一个我们从未尝试过的次要计划,但它可能适合您: 在启动时读取OS的DPI比例因子。然后通过此因子减少您拥有的所有字体实例,以便当Windows再次缩放字体时,它们将返回到UI可以适合它们的大小。当然,具有高DPI设置的用户不会在应用程序中获得更大的字体,但它至少可以使用。