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

MFC picture control changes size when DPI awareness disabled or running on Win7

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

但是当他运行他电脑上Win7的app的时候,Picture Control里的Bitmap图片放大了,遮住了下面的一些文本框,看起来像这样

.

我搜索后发现可能与DPI感知有关。我在 Manifest Tool 的 属性 页面中禁用了 DPI-Awareness 并进行了重建。即使在Win10中运行也发生同样的事情。

谁能帮我解释一下这个问题的原因并找到修复图像控件大小的解决方案?谢谢

通常情况下,我更喜欢使用 SetWindowPos() 来设置在不同情况下我想要的图像大小,从而将控制权掌握在手中。您可以使用下面两行来 control/set 图像的位置和大小。

假设图片控件的ID是IDC_STATIC2那么你可以这样使用:

CStatic * pStatic = (CStatic *) GetDlgItem(IDC_STATIC2);
pStatic->SetWindowPos(NULL,20,20,50,50,0);

主要问题是来自资源的对话总是以 DLU 来衡量。

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

请参阅this article如何计算对话基本单位。

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

并且因为当您选择无 DPI 感知时只是字体发生变化,并且因为字体从 windows 版本更改为 windows 版本,您的对话框总是看起来不同。

建议:绘制您自己的图片并相应地拉伸它。

另外 this Whosebug question 是不错的文档,显示了 DLU 的效果。

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

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