为什么GDI +颜色会根据工具提示是否可见而有所不同?

时间:2010-05-03 04:44:45

标签: c++ gdi+ gdi

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

然而,在Windows XP系统上,我们对此进行测试只有在显示任何工具提示时(例如IE中的“title”属性,或者将鼠标悬停在文件上时显示的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));

2 个答案:

答案 0 :(得分:1)

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

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

可能的替代解决方案:

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

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

答案 1 :(得分:1)

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

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

由于某些原因使用蓝色作为背景不起作用并且使用TransparentBlt本身使用任何一种颜色都不起作用,但该组合在我尝试的各种操作系统和颜色深度上正确应用了透明度。 / p>

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