2010-05-03 81 views
1

我正在使用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)); 
+0

愚蠢的问题,但如果你选择了不同的颜色,也会发生同样的问题吗? – 2010-05-03 05:02:48

+0

不幸的是。我用同样的结果尝试黑色。 – dlanod 2010-05-03 07:00:54

回答

1

我最终做的是更多的解决方法,但它确实有效。我改变了背景颜色为黑色,并添加以下代码的DrawImage调用之前:使用此蓝色为背景没有工作,利用自身TransparentBlt与无论是色彩没有

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

出于某种原因工作,但该组合在我尝试的各种操作系统和颜色深度上正确应用了透明度。

如果我有权访问一个支持具有alpha通道的位图文件的绘图程序,即32位位图,我怀疑要使背景明确透明,然后使用AlphaBlend会有效,但我没有能力在当时尝试。

1

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

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

可能的替代方案:

  1. 确保位图在其原生格式加载,无需转换。

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

+0

添加了一个代码示例。我尝试使用GetPixel方法,但没有任何运气。 – dlanod 2010-05-05 04:01:53

+1

尝试将StretchBltMode设置为COLORONCOLOR并查看会发生什么。您在blitting时调整位图大小,因此我猜测您的位图只有少数“透明”像素,并且使用HALFTONE插入它们并且永远不匹配“透明”值。当位深度为16位时,匹配的可能性更大,但当位深度为24/32位时,匹配值永远不会找到。 – qbeuek 2010-05-06 05:43:46