【问题标题】:MFC picture control changes size when DPI awareness disabled or running on Win7当 DPI 感知禁用或在 Win7 上运行时,MFC 图片控件更改大小
【发布时间】:2017-09-20 10:19:20
【问题描述】:

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

但是当他在Win7的电脑上运行应用程序时,优化校准中的位图图像放大并覆盖了下面的一些文本框,看起来像这样。

.

经过我的搜索并意识到这可能与 DPI 意识有关。我在 Manifest Tool 的属性页面中禁用了 DPI-Awareness 并重新构建。即使在 Win10 中运行也会发生同样的情况。

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

【问题讨论】:

  • 解决方案,您可以在图片应有的位置放置一个隐藏的静态控件。覆盖对话框的OnPaint 并使用StretchBlt 绘制位图。您需要m_static.GetWindowRect(rect)ScreenToClient(rect) 才能找到正确的坐标。

标签: mfc backwards-compatibility dpi-aware


【解决方案1】:

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

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

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

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

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

建议:画你自己的图片并相应地拉伸它。

this stackoverflow question 也是不错的文档,展示了 DLU 的效果。

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

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

【讨论】:

【解决方案2】:

通常情况下,我更喜欢通过使用SetWindowPos() 来设置我在不同情况下想要的图像大小来控制自己。您可以使用以下两行来控制/设置图像的位置和大小。

假设优化校准的 ID 是IDC_STATIC2,那么你可以这样使用:

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

【讨论】:

  • 这个答案没有解释原因,为什么尺寸不同。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-03-12
  • 2016-03-13
  • 2011-11-28
  • 2019-07-23
  • 1970-01-01
  • 1970-01-01
  • 2011-06-06
相关资源
最近更新 更多