對于透明位圖顯示,GDI有現成的函數TransparentBlt可以完成,在這我們自己寫代碼實現類似TransparentBlt的功能。
為了說明這個透明位圖顯示的原理,我們就用一個最簡單的單一色的圖來說明:我們在一張背景色為紅色RGB(255,0,0)的圖片上繪制一個藍色RGB(0,0,255)的圓,其中透明色為粉紅RGB(255,0,255).如下圖

1)為繪制的圖片創建遮罩圖層。創建一個與要繪制的圖片大小相同的1位單色位圖,要繪制的地方為黑色,透明的地方為白色。如圖:

這步用代碼很容易實現,創建一個1位單色位圖上,以透明色為背景,以非透明色為畫筆色,將要繪制的圖片畫一遍就可以了。
//創建位圖的遮罩圖層
HBITMAP hmask=CreateBitmap(256,256,1,1,NULL);
HDC maskhdc=CreateCompatibleDC(NULL);
SelectObject(Chdc,hbit);
SelectObject(Chdc1,hbit1);
SelectObject(maskhdc,hmask);
//設置遮罩圖層背景顏色
SetBkColor(Chdc1,RGB(255,0,255));
//生成遮罩位圖
BitBlt(maskhdc,0,0,256,256,Chdc1,0,0,SRCCOPY);
2)用要繪制的圖片與背景圖片做異或運算,得到的圖片
要透明色的區域:紅RGB(255,0,0) XOR 粉紅RGB(255,0,255) = 藍色RGB(0,0,255)
繪制區域:紅RGB(255,0,0) XOR 藍RGB(,0,255) = 粉紅RGB(0,0,255),如下圖:

//目的和源做異或(XOR)運算
BitBlt(backhdc,0,0,256,256,Chdc1,0,0,SRCINVERT);
3)用遮罩位圖與上步完成的圖片做與運算,得到的圖片
要透明色的區域:藍RGB(0,0,255) AND 白RGB(255,255,255) = 藍色RGB(0,0,255)
繪制區域:粉紅RGB(255,0,255) AND 黑RGB(0,0,0) = 黑色RGB(0,0,0),如下圖:

//目的和源做異或(XOR)運算
BitBlt(backhdc,0,0,256,256,Chdc1,0,0,SRCINVERT);
4)用要繪制的圖片與上步完成的圖片做異或運算,得到的圖片
要透明色的區域:藍RGB(0,0,255) XOR 粉紅RGB(255,0,255) = 紅色RGB(255,0,0)
繪制區域:黑RGB(0,0,0) XOR 藍RGB(0,0,255) = 藍RGB(0,0,255),如下圖:
//目的和源做異或(XOR)運算
BitBlt(backhdc,0,0,256,256,Chdc1,0,0,SRCINVERT);
這樣就完成了透明位圖的顯示了,原理和方法就是這樣,用這樣的方法可以擴展到非單色位圖上來。在這就不多談了,自己去試試就知道了,最后附上這個單色透明位圖的源代碼:
VDISK下載