对于透明位图显示,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下载