Windows应用程序-DPI问题

Windows应用程序-DPI问题,windows,mfc,dpi,Windows,Mfc,Dpi,我们现有的一个基于Win32 MFC的应用程序出现问题。在使用高dpi设置的显示器上无法正确渲染。更具体地说,在选择了120 dpi的windowsxp中,应用程序中有几个地方的文本会放大,但它们的容器不会放大(文本溢出了按钮的边界,等等)。在Windows 7(和Vista)中,当选择>96 dpi且选择“使用XP样式的dpi缩放”时,也会发生这种情况。如果未选择xp样式的扩展,则我理解Win7使用DPI虚拟化。当使用DPI虚拟化时,一切看起来都很好(好的,事情很模糊,但至少它们是正确的)。默

我们现有的一个基于Win32 MFC的应用程序出现问题。在使用高dpi设置的显示器上无法正确渲染。更具体地说,在选择了120 dpi的windowsxp中,应用程序中有几个地方的文本会放大,但它们的容器不会放大(文本溢出了按钮的边界,等等)。在Windows 7(和Vista)中,当选择>96 dpi且选择“使用XP样式的dpi缩放”时,也会发生这种情况。如果未选择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配置更改

到目前为止,我还没有找到实现这两种解决方案的方法

能不能请对这个问题更了解的人回答并给我指出正确的方法


谢谢

您不能在120 DPI设置上强制DPI虚拟化。我自己也对一款产品进行了调查,因为在高DPI中使用模糊外观似乎是一个很好的折衷方案

我们最终对UI定位和缩放进行了全面重写,以使其在高DPI设置下能够正确缩放字体。客户机现在完全支持DPI,并且可以在任何DPI设置中正确扩展

对于一个相当复杂的客户来说,正确完成这项工作需要一个人~3个月的时间

我们有一个从未尝试过的次要计划,但它可能对您有用:
启动时读取操作系统的DPI比例因子。然后按此系数减少所有字体实例,以便当Windows再次放大字体时,它们会恢复到UI可以容纳它们的大小。当然,具有高DPI设置的用户不会在应用程序中获得更大的字体,但它至少是可用的。

布局代码或绘图代码中有问题吗?例如,问题是您正在以x x x y像素制作按钮和其他标准控件,还是您的代码绘制了具有固定大小的控件(例如,使用GDI调用)?你的布局怎么样?形式?对话框模板?自定义代码?这里没有魔法,你只需要把你的窗口变大就行了。或者你的字体变小,选择你的毒药。