2011-11-03 34 views
5

我们现有的一个基于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时错误。Windows应用程序 - DPI问题

如果我编辑的应用程序清单申报程序为“DPI知道”,那么这原来DPI虚拟化(但不是XP风格DPI缩放),并且这让我没有在那里。事情仍然看起来非常糟糕(120dpi没有改变,144dpi现在打破了)。

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

到目前为止,我还没有找到一种方法来实现任何一个解决方案。

可有人就这个问题请回复,并指出我在正确的方式更懂行?

谢谢

+1

布局代码或绘图代码中存在问题吗?例如,是否按y像素制作按钮和其他标准控件的问题,还是您有代码绘制您自己的具有固定大小的控件(例如,使用GDI调用)的问题?你如何做你的布局?形式?对话框模板?自定义代码? –

+0

这里没有魔法,你只需要让你的窗户变大。或者你的字体较小,选择你的毒药。 –

回答

2

无法在120 DPI设置上强制进行DPI虚拟化。我已经为自己的产品进行了调查,因为拥有高DPI的模糊外观似乎是一个很好的折衷。

我们最终使得UI定位的全部重写,并扩展到有它在高DPI设置的字体缩放正确缩放。客户现在完全了解DPI,并在任何DPI设置中正确扩展。

做到这一点的正常工作了一个人〜3个月对我们来说一个相当复杂的客户端。

我们有一个我们从未尝试的辅助计划,但它可能适用于您: 在启动时,请阅读操作系统的DPI比例因子。然后缩小这个因子的所有字体实例,这样当Windows再次缩放字体时,它们又回到了UI可以适应它们的大小。当然,具有高DPI设置的用户在应用程序中不会获得更大的字体,但至少可以使用。