【问题标题】:Correlating bitmap size to window units at 96DPI将位图大小与 96DPI 的窗口单位相关联
【发布时间】:2015-05-04 16:00:31
【问题描述】:

我正在为我的 MFC 应用程序创建位图。我的桌面设置为 96dpi,我正在尝试填充 29x25 位图按钮。我们使用的示例位图大小为 42x40。当叠加到我们的按钮上时,图像看起来不像我预期的那样清晰明快。

作为一个例子,这是我正在使用的代码:

CBitmapButton::DrawItem(lpDIS);

CDC *dcMem, *pdcBmp;
// Get the DC for the Base Bitmap
dcMem = CDC::FromHandle(lpDIS->hDC);
pdcBmp = new CDC();
pdcBmp->CreateCompatibleDC(dcMem);
DrawOverlay(&selectedBmp, pdcBmp, dcMem);  //selected bmp is a class variable

void OverlayButton::DrawOverlay(CBitmap *bmp, CDC *pdcBmp, CDC *dcMem)
{
    BITMAP bitmapInfo;
    bmp->GetBitmap(&bitmapInfo);
    pdcBmp->SelectObject(bmp);
    dcMem->TransparentBlt(0, 0, bitmapInfo.bmWidth, bitmapInfo.bmHeight,
    pdcBmp, 0, 0, bitmapInfo.bmWidth, bitmapInfo.bmHeight,
    RGB(192, 192, 192));
}

所以我的问题是: 如何确定位图或按钮的正确大小以适应位图而不拉伸和可能丢失细节?

如果我有一个 32x32 位图,它如何与 96dpi 的 VS 中的窗口单位相对应?

【问题讨论】:

  • 你目前卡在哪里了?什么为您解决了这个问题?

标签: visual-studio bitmap mfc dpi


【解决方案1】:

DPI 是每英寸点数。每个点是一个像素。它只是让您知道每英寸可以看到多少像素。因此,您的 32x32 位图在屏幕上将是 1/3 英寸乘以 1/3 英寸。这与您的问题无关。

“我正在尝试填充 29x25 位图按钮。我们使用的示例位图的大小为 42x40。”

这就是问题的根源。如果您有一个带有位图图像的 29x25 像素按钮,请为该图像使用 29x25 像素位图。使用 42x40 甚至不是正确的纵横比。我一点也不惊讶它看起来是扭曲的。

您最好的选择是完全匹配像素大小或具有 2 的幂。因此,58x50 或 116x100,但 29x25 将提供您想要的。

它使它适合按钮,将目标设置为按钮的宽度和高度。但是,听起来您已经将按钮设置为正确的大小。我只是好奇你是如何设置大小的。您是使用代码设置像素大小,还是使用 GUI 中的其他“大小”?

dcMem->TransparentBlt(0, 0, button.width, button.height, pdcBmp, 0, 0, bitmapInfo.bmWidth, bitmapInfo.bmHeight, ...

【讨论】:

  • 这是有道理的。在这种情况下,使用更大的、适当缩放的位图会给我更多的细节吗?还是在压缩到目标大小时会丢失?
  • 当您使用较大的图像时,它会通过内置函数进行缩放。您最好提供您想要显示的图像。某些图像在按比例缩小时会出现奇怪的伪影。简单地使用您想要的图像大小是最简单的。但是,如果您的 GUI 设计不断变化且不稳定,并且按钮大小可能会发生变化,那么每次都必须重新生成图像会很烦人。
  • 我很快修改了我的示例程序以使用一个 42x40 单位的按钮来匹配也是 42x40 像素的图标。我所看到的图像没有尝试实际填充按钮的大小。按钮大小在 Visual Studio 中,所以我的印象是 VS 中的 42x40 按钮不等于 42x40 像素,而是涉及一些缩放。
  • 这更像是一个停靠/锚定问题。只需根据您的需要正确设置表单即可。我不完全理解这个问题。您所说的两种尺寸的屏幕截图可能有助于我(或其他人)准确理解问题,以便我们为您提供正确的解决方案。
  • 这不是停靠/锚点问题。在我的示例代码中,我调用了 transparentblt 并将位图大小传递给源大小和目标大小。这表明对话单元与像素大小之间没有 1:1 的相关性。我更新了代码以正确传递按钮的大小作为目标大小,但它仍然没有解决如何调整我的位图按钮大小以正确适应现有位图而不必拉伸/收缩的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-03
  • 2015-06-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多