当前位置:C++技术网 > 资讯 > 透明位图的创建和说明

透明位图的创建和说明

更新时间:2015-06-24 19:41:42浏览次数:1+次

直接上代码

CPaintDC dc(this); // device context for painting
dc.BitBlt(50, 0, mdc.GetWidth(),mdc.GetHeight(), &mdc, 0, 0, SRCCOPY);
CMemDC dcImage(mdc.GetWidth(),mdc.GetHeight(),&dc);//原图DC
CBitmap bmpMask;
bmpMask.CreateBitmap(mdc.GetWidth(),mdc.GetHeight(), 1, 1, NULL);// 创建单色掩码位图
CDC dcMask;//掩码DC 
dcMask.CreateCompatibleDC(&dc);
dcMask.SelectObject(bmpMask);
//将载入位图的内存DC中的位图,拷贝到临时DC中(this指针加载的图片显示在空白位图上,需要在主程序中加载图片)
dcImage.BitBlt( 0, 0, mdc.GetWidth(),mdc.GetHeight(),&mdc, 0, 0, SRCCOPY);

// 设置临时DC的透明色,这是要清除的颜色。
dcImage.SetBkColor(RGB(181,230,29));
//掩码DC的透明区域为白色其它区域为黑色
dcMask.BitBlt(0, 0, mdc.GetWidth(),mdc.GetHeight(), &dcImage, 0, 0, SRCCOPY);
dc.BitBlt(150, 0, mdc.GetWidth(),mdc.GetHeight(), &dcMask, 0, 0, SRCCOPY);
//临时DC透明区域为黑色,其它区域保持不变
dcImage.SetBkColor(RGB(0,0,0));
dcImage.SetTextColor(RGB(255,255,255));
dcImage.BitBlt( 0, 0, mdc.GetWidth(),mdc.GetHeight(), &dcMask, 0, 0, SRCAND);
dc.BitBlt(230, 0, mdc.GetWidth(),mdc.GetHeight(), &dcImage, 0, 0, SRCCOPY);
// 目标DC透明部分保持屏幕不变,其它部分变成黑色
dc.SetBkColor(RGB(255,255,255));
dc.SetTextColor(RGB(0,0,0));
dc.BitBlt(50, 100, mdc.GetWidth(),mdc.GetHeight(), &dcMask, 0, 0, SRCAND);
dc.BitBlt(0,0,mdc.GetWidth(),mdc.GetHeight(), &dcImage, 0, 0, SRCPAINT);

    解释 mdc是已经加载位图的DC,所有代码都在OnPaint中运行。
    下面是透明位图产生过程示意图 :点此阅读透明位图产生原理  ,文章中有各阶段位图,位图光栅运算的规则如下:(不是很严谨,没有专门弄过图片处理)
     黑色各位是纯0,所以任何颜色与它相与都变成黑色,白色各位是纯1,所以任何颜色与它相与都维持原色。或就是对应白色的部分变成白色(这里的白色不是纯白,而是非纯黑的意思),对应黑色的部分不变。而且与后,原来的图和掩码图只要不被覆盖就始终存在。 
    结合以上位图的操作,我写的WM_PAINT消息处理的代码,和那篇百度文档综合起来就可以很好理解透明位图的产生过程,至于位图光栅操作的细节知识,可以在专门处理项目的时候再去研究。也欢迎分享。