您的位置:首页 > 其它

透明贴图TransparentBlt函数

2009-04-23 10:54 204 查看
 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中有严重的资源泄漏,根本不能用。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  mfc windows 存储