2010-05-03 60 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