Windows 应用程序 - DPI 问题

标签 windows mfc dpi

我们现有的一个基于 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 下看起来是错误的。

如果我编辑应用程序 list 以将应用程序声明为“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 设置的用户不会在您的应用程序中获得更大的字体,但至少可以使用。

关于Windows 应用程序 - DPI 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8000051/

相关文章:

php - VI编辑器_将文件夹从Windows移动到Web服务器

pdf - PDF 文档可以包含具有不同 DPI 的图像吗?

android - 从源代码的 res/values/dimension.xml 加载维度值

windows - 生产代码中的工作流

windows - 调用包含变量的 webrequest -body

windows - Windows上Perl如何处理程序异常终止

c++ - AfxBeginThread 破坏了作为参数传递给线程函数的类中的 LPWSTR 值。为什么?

visual-c++ - 为什么 SetWindowText 不再起作用?

c++ - 在 Windows7 中从安全屏幕 (Ctrl+Alt+Del) 返回时未收到 WM_PAINT 消息

wpf - 将高 DPI 图像转换为低 DPI 进行打印抛出 OutOfMemoryException