【问题标题】:Why would GDI+ colours vary based off whether a tooltip is visible?为什么 GDI+ 颜色会根据工具提示是否可见而变化?
【发布时间】:2011-02-14 21:59:48
【问题描述】:

我正在使用 GDI+ 显示位图。从 DLL 资源加载位图后,我使用 TransparentBlt 将背景颜色(蓝色 - #0000FF)设置为透明。在 Windows Vista 及更高版本上,这可以按预期工作。

但是,在我们正在测试的 Windows XP 系统上,此功能仅在显示任何工具提示(例如 IE 中的“标题”属性,或将鼠标悬停在文件上时显示的 Windows 资源管理器的工具提示等)时才有效。其余时间背景颜色仍为蓝色。

以前有没有人遇到过这种情况,或者知道如何阻止这种情况发生并使蓝色正确透明?

编辑:经过进一步调查,我发现将 Windows XP 中的颜色深度设置为 16 位颜色而不是 32 位颜色会导致 TransparentBlt 再次开始正常工作。显然这不是一个理想的解决方案,指定必须使用什么颜色深度,但这是否暗示了可能发生的事情?

Edit2:包含代码示例。

m_pGDIBitmap = new Gdiplus::Bitmap(_Module.m_hInst, MAKEINTRESOURCE(lImageResource));
m_hMemDC = CreateCompatibleDC(hdc);

Gdiplus::Graphics myGraphics(m_hMemDC);

myGraphics.DrawImage(m_pGDIBitmap, 
    Gdiplus::Rect(0, 0, m_pGDIBitmap->GetWidth(), m_pGDIBitmap->GetHeight()), 
    0, 
    0,
    m_pGDIBitmap->GetWidth(), 
    m_pGDIBitmap->GetHeight(),
    Gdiplus::UnitPixel, &imAtt);

SetStretchBltMode(hdc, HALFTONE);
SetBrushOrgEx(hdc, rcBounds.left, rcBounds.top, NULL);
TransparentBlt(hdc, rcBounds.left, rcBounds.top, iScaledWidth, iScaledHeight, m_hMemDC, 0, 0, iBitmapWidth, iBitmapHeight, GetPixel(m_hMemDC, 0, 0));

【问题讨论】:

  • 愚蠢的问题,但如果你选择不同的颜色会发生同样的情况吗?
  • 不幸的是,是的。我尝试了黑色,结果相同。

标签: c++ gdi+ gdi


【解决方案1】:

您必须展示一些示例代码 - 加载位图的代码和使其显示的代码。

从您描述的症状来看,我的猜测是您加载的位图不是以其本机格式,而是以当前的显示格式。这意味着,当位图的位深度与显示的位深度不同时,会进行自动色彩空间转换。发生这种情况时,您提供给 TransparentBlt 的颜色实际上与位图中的颜色不同。

可能的替代解决方案:

  1. 确保以原始格式加载位图而不进行转换。

  2. 允许进行转换,但不是向 TransparentBlt 提供硬编码的颜色值,而是为位图的已知“透明”像素(如左上角)创建一个 GetPixel,并将此值提供给透明Blt。

【讨论】:

  • 添加了代码示例。我尝试使用 GetPixel 方法没有任何运气。
  • 尝试将 StretchBltMode 设置为 COLORONCOLOR 看看会发生什么。您正在调整位图的大小,所以我猜测您的位图只有几个“透明”像素,并且使用 HALFTONE 它们被插值并且永远不会匹配“透明”值。位深为16位时,匹配的机会较大,但位深为24/32位时,永远找不到匹配值。
【解决方案2】:

我最终做的更多的是一种解决方法,但它确实奏效了。我将背景颜色更改为黑色,并在 DrawImage 调用之前添加了以下代码:

Gdiplus::ImageAttributes imAtt;
imAtt.SetColorKey(Gdiplus::Color(0, 0, 0), Gdiplus::Color(0, 0, 0), Gdiplus::ColorAdjustTypeBitmap);

由于某种原因,将其与蓝色一起用作背景不起作用,并且单独使用 TransparentBlt 与任何一种颜色都不起作用,但该组合在我尝试过的各种操作系统和颜色深度上正确应用了透明度。

如果我可以访问支持带有 Alpha 通道的位图文件(即 32 位位图)的绘图程序,我怀疑使背景显式透明,然后使用 AlphaBlend 也可以,但我没有能力到时候试试。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-03-26
    • 1970-01-01
    • 2021-05-15
    • 2022-08-16
    • 2015-12-11
    • 1970-01-01
    • 2012-09-20
    相关资源
    最近更新 更多