为什么GDI +颜色会根据工具提示是否可见而变化?
我正在使用GDI +显示位图。从DLL资源加载位图后,我使用TransparentBlt将背景颜色(蓝色 - #0000FF)设置为透明。在Windows Vista和更高版本上,按预期工作。为什么GDI +颜色会根据工具提示是否可见而变化?
但是,在我们测试的Windows XP系统上,只有在显示任何工具提示(例如IE中的“title”属性,或将鼠标悬停在文件上时显示的Windows资源管理器的工具提示)时才能使用。剩下的时间背景颜色仍然是蓝色的。
有没有人遇到过这种情况,或知道一种方法来阻止这种情况的发生,并使蓝色适当变得透明?
编辑:经过进一步调查后,我发现将Windows XP中的颜色深度设置为16位颜色而不是32位颜色,导致TransparentBlt再次开始正常工作。显然,这不是一个理想的解决方案,指定必须使用哪种颜色深度,但是这是否会提示可能发生的情况?
编辑2:包括代码示例。
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));
我最终做的是更多的解决方法,但它确实有效。我改变了背景颜色为黑色,并添加以下代码的DrawImage调用之前:使用此蓝色为背景没有工作,利用自身TransparentBlt与无论是色彩没有
Gdiplus::ImageAttributes imAtt;
imAtt.SetColorKey(Gdiplus::Color(0, 0, 0), Gdiplus::Color(0, 0, 0), Gdiplus::ColorAdjustTypeBitmap);
出于某种原因工作,但该组合在我尝试的各种操作系统和颜色深度上正确应用了透明度。
如果我有权访问一个支持具有alpha通道的位图文件的绘图程序,即32位位图,我怀疑要使背景明确透明,然后使用AlphaBlend会有效,但我没有能力在当时尝试。
您必须显示一些示例代码 - 加载位图的代码和将其显示的代码。
从你描述的症状中,我的猜测是你加载的位图不是以其原始格式,而是以当前的显示格式。这意味着,当位图的位深度与显示器的位深度不同时,自动进行颜色空间转换。发生这种情况时,您提供给TransparentBlt的颜色实际上与位图中的颜色不同。
可能的替代方案:
确保位图在其原生格式加载,无需转换。
允许进行转换,但不是为TransparentBlt提供硬编码的颜色值,而是为位图中的已知“透明”像素(如左上角)制作GetPixel,并将此值提供给TransparentBlt 。
愚蠢的问题,但如果你选择了不同的颜色,也会发生同样的问题吗? – 2010-05-03 05:02:48
不幸的是。我用同样的结果尝试黑色。 – dlanod 2010-05-03 07:00:54