Windows 应用程序 - DPI 问题

Posted

技术标签:

【中文标题】Windows 应用程序 - DPI 问题【英文标题】:Windows Application - DPI Issues 【发布时间】:2011-11-03 18:28:52 【问题描述】:

我们现有的基于 Win32 MFC 的应用程序之一出现问题。它无法在使用高 dpi 设置的显示器上正确呈现。更具体地说,在选择 120 dpi 的 Windows XP 中,应用程序中有几个地方的文本会放大,但它们的容器不会(文本溢出按钮的边界等)。 This also occurs in Windows 7 (and Vista) when >96 dpi is selected and "use XP style dpi scaling" is selected.如果没有选择 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 配置更改。

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

可以请对此主题更了解的人回复并指出正确的方法吗?

谢谢

【问题讨论】:

是你的布局代码还是你的绘图代码有问题?例如,问题是您正在制作按钮和其他标准控件 x x y 像素,还是您的代码绘制您自己的具有固定大小的控件(例如,使用 GDI 调用)?你的布局怎么样?形式?对话框模板?自定义代码? 这里没有什么神奇的,你只需要让你的窗户更大。或者你的字体更小,选择你的毒药。 【参考方案1】:

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

我们最终对 UI 定位和缩放进行了完全重写,以使其在高 DPI 设置中与字体缩放一起正确缩放。客户端现在完全了解 DPI,并且可以在任何 DPI 设置中正确缩放。

在我们的案例中,对于一个非常复杂的客户来说,正确完成这项工作需要一个人大约 3 个月的时间。

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

【讨论】:

以上是关于Windows 应用程序 - DPI 问题的主要内容,如果未能解决你的问题,请参考以下文章

Windows DPI Awareness for WPF

如何在 Windows 上测试不同 DPI/屏幕分辨率的 Qml/Quick UI?

如何创建与 Windows 7 向后兼容的缩放和大小更改的 Per-Monitor DPI 感知应用程序?

关闭高dpi带来的影响

在 win32 应用程序中动态设置 DPI 感知级别

c# winform程序.在控制面板中调整了DPI设置显示异常