TransparentBlt这个函数解析如下:
函数功能:该函数对指定的源设备环境中的矩形区域像素的颜色数据进行位块(bit_block)转换,并将结果置于目标设备环境。
函数原型:BOOL TransparentBltm(HDC hdcDest, int nXOriginDest, int nYOriginDest, int nWidthDest, int hHeightDest, HDC hdcSrc, int nXOriginSrc, int nYOriginSrc, int nWidthSrc, int nHeightSrc, UINT crTransparent);
参数:
hdcDest:指向目标设备环境的句柄。(你要将贴图画上去的DC)
nXOriginDest:指定目标矩形左上角的X轴坐标,坐标以逻辑单位表示。(你将要贴图的左上角x相对坐标)
nYOriginDest:指定目标矩形左上角的Y轴坐标,坐标以逻辑单位表示。(你将要贴图的左上角y相对坐标)
nWidthDest:指定目标矩形的宽度。(你的贴图的宽,不要超过目标DC的宽)
nHeightDest:指定目标矩形高度的句柄。(你的贴图的高,不要超过目标DC的高)
hdcsrc:指向源设备环境的句柄。(已经存储了贴图的DC,即已经把贴图选做操作对象的DC)
nXOriginSrc:指定源矩形(左上角)的X轴坐标,坐标以逻辑单位表示。(准备剪切贴图的左上x坐标,取0得了)
nYOriginsrc:指定源矩形(左上角)的Y轴坐标,坐标以逻辑单位表示。(取0得了)
nWidthSrc:指定源矩形的宽度。(贴图宽)
nHeightSrc:指定源矩形的高度。
crTransparent:源位图中的RGB值当作透明颜色。(贴图中要滤掉的颜色)
返回值:如果函数执行成功,那么返回值为TRUE;如果函数执行失败,那么返回值为FALSE。
Windows NT:若想获取更多错误信息,请调用GetLastError函数。
备注:函数TransparentBlt支持4位/像素和8位/像素格式的源位图,使用AlphaBlend可以指定带有透明度的32位/像素格式的位图。如果源和目标矩形的大小不一致,那么将对源位图进行拉伸以与目标矩形匹配,当使用SetStretchBltMode函数时,BLACKONWHITE和WHITEONBLACK两种iStretchMode模式将被转换成TransparentBlt函数的COLORONCOLOR模式。目标设备环境指定了用于目标坐标的变换类型,而源设备环境指定了源坐标使用的变换类型。如果源位图或目标位图的宽度或高度是负数,那么TransparentBlt函数也不对位图进行镜像。
速查:Windows NT:5.0及以上版本;Windows:98及以上版本;Windows CE:不支持;
头文件:wingdi.h。
库文件:作为一个资源包含在msimg32.dll中。
【问题的解决】
函数最后一个参数即要滤掉的颜色有两种表示方式,一种为RGB(红色值,绿色值,蓝色值),一种为16位进制数,如红色为0x000000ff,白色为0x00ffffff。如要滤掉图片中的白色,要先确认图片白色区域像素的色值是否都是0x00000000[RGB(255,255,255)],可以用带有调色板的图片编辑软件打开图片来检查,如是,把参数设成0x00000000就成了,如不是就麻烦了,建议用photoshop将图片白色区域全部刷成一个色值的颜色,记下这个色值,把参数设成此数值也能解决问题。
【最后提醒】
这个函数似乎不能对虚拟位图进行滤色。如在一个DC上用画笔画刷画个实心圆,当然要画到与此DC关联的虚拟位图上(否则也画不出来),然后用此函数滤色时就不行。
【应用示例】
(注意,用的是MFC对话框)
如要将本地目录下的800*600大小的位图mm.bmp显示出来,应先将在项目资源中添加此图片文件,比如得到的图片资源号为IDB_BITMAP1,接下来添加代码为:
1、包含头文件
#include <wingdi.h>
2、在对话框头文件中添加
CBitmap m_bmp;
3、在对话框初始化函数OnInitDialog()中加载位图
m_bmp.LoadBitmap(IDB_BITMAP1);
4、在绘制函数OnPaint()的else内添加
//自定义绘制
CDC* cdc = GetDC(); //前台DC
CDC bufferDC; //后台DC
CDC tempDC; //临时DC
CBitmap bufferBMP; //后台DC位图
//DC关联
bufferDC.CreateCompatibleDC(cdc);
tempDC.CreateCompatibleDC(cdc);
//后台DC位图关联
bufferBMP.CreateCompatibleBitmap(cdc,800,600); bufferDC.SelectObject(bufferBMP);
tempDC.SelectObject(m_bmp);
bufferDC.TransparentBlt(0,0,800,600,&tempDC,0,0,800,600,RGB(255,255,255));
//绘制到前台DC
cdc->BitBlt(0,0,800,600,&bufferDC,0,0,SRCCOPY);
//释放资源
bufferBMP.DeleteObject();
tempDC.DeleteDC();
bufferDC.DeleteDC();
this->ReleaseDC(cdc);
//OK,这样就画出来了,并且滤掉图片中的白色(0x00000000)。
TransparentBlt在WIN2000和以后的系统上可用。在WIN98中有严重的资源泄漏,根本不能用。