当 DPI 感知禁用或在 Win7 上运行时,MFC 图片控件会更改大小

标签 mfc backwards-compatibility dpi-aware

我在Win10中使用VS2015为我的 friend 制作了一个MFC应用程序。看起来像这样,和资源编辑器中的一模一样。

this

但是当他在Win7电脑上运行该应用程序时,Picture Control中的位图图像会放大并覆盖下面的一些文本框,如下所示。

this .

经过查找,发现可能和DPI感知有关。我在 Manifest Tool 的属性页中禁用了 DPI-Awareness 并重新构建。即使在Win10中运行也发生同样的情况。

this

有人可以帮我解释一下这个问题的原因并找到修复图像控件大小的解决方案吗?谢谢。

最佳答案

主要问题是来自资源的对话始终以 DLU 进行测量。

DLU 是根据对话框使用的字体大小计算的。

参见this article如何计算对话框基本单位。

现在您有了一个以 DLU 为单位大小的静态图片控件。当您将位图分配给静态对话框控件时,该位图仅以像素为单位进行缩放,并且永远不会调整其大小。而且由于静态控件的实际大小取决于所使用的字体,因此您的对话框和位图会获得不同的布局。

因为当您选择无 DPI 感知时,只是字体发生变化,并且由于字体在 Windows 版本之间发生变化,所以您的对话框看起来总是不同。

建议:画出你自己的图画并相应地扩展它。

还有this stackoverflow question是很好的文档,展示了 DLU 的效果。

这里有一些自动调整图片控件大小的代码。

  1. An auto-sizing bitmap picture control
  2. A simple image preview class using GDI+
  3. CxImage

关于当 DPI 感知禁用或在 Win7 上运行时,MFC 图片控件会更改大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46319437/

相关文章:

c++ - 将工程应用程序从独立移动到内部 CAD

c# - Windows XP 上的 Windows API 代码包向后兼容性

.net-3.5 - .net 4 向后兼容性

winforms - 设置/缩放控件滚动条的宽度

c++ - 设置我的应用程序 api 感知并防止系统使其模糊和错误定位

winforms - 每个显示器 DPI 感知的 Windows 系统镜像列表

c++ - 在 MFC 应用程序中未调用重叠的 WSARecv() 回调

c++ - 如何调整 CListCtrl 列的宽度以适应每列中最长的字符串?

c++ - 在 vector 中删除/更新结构值时出现编译错误?

delphi - 记录文件升级和向后兼容性