对于TransparentBlt()函数的疑惑

对于TransparentBlt()函数的疑惑悬赏分:30-离问题结束还有14天22小时voidTransparentBlt2(HDChdc0,//目标DCintnX0,... 对于TransparentBlt()函数的疑惑
悬赏分:30 - 离问题结束还有 14 天 22 小时
void TransparentBlt2( HDC hdc0, // 目标DC
int nX0,int nY0,// 目标偏移
int nW0,int nH0,// 目标宽高度
HDC hdc1, // 源DC
int nX1,int nY1,// 源起点
int nW1,int nH1,// 源宽高度
UINT Tcol // 透明色,COLORREF类型
) //透明显示[4章]
{//A、建立图形资源。
HBITMAP hBMP =CreateCompatibleBitmap(hdc0,nW0, nH0); //创建位图内存
HBITMAP mBMP =CreateBitmap(nW0,nH0,1,1,NULL); //创建单色掩码位图
HDC hDC =CreateCompatibleDC(hdc0); //创建设备句柄
HDC mDC =CreateCompatibleDC(hdc0); //创建设备句柄
HBITMAP oldBMP =(HBITMAP)SelectObject(hDC, hBMP);
HBITMAP oldmBMP=(HBITMAP)SelectObject(mDC, mBMP);
//B、拷贝或压缩拷贝源DC中的位图到临时hDC中。
if (nW0==nW1&&nH0==nH1)
BitBlt(hDC,0,0,nW0,nH0,hdc1,nX1,nY1,SRCCOPY);
else
StretchBlt(hDC,0,0,nW0,nH0,hdc1,nX1,nY1,nW1,nH1,SRCCOPY);
//C、生成掩码位图。
SetBkColor(hDC, Tcol);// 设置透明色
BitBlt(mDC,0,0,nW0,nH0,hDC,0,0,SRCCOPY);// 生成白色透明区,其它区域为黑色的掩码位图
SetBkColor(hDC, RGB(0,0,0)); // 生成黑色透明区,其它区域保持不变的位图
SetTextColor(hDC, RGB(255,255,255)); // 白色
BitBlt(hDC,0,0,nW0,nH0,mDC,0,0,SRCAND);
SetBkColor(hdc0,RGB(255,255,255)); // 透明部分保持屏幕不变,其它部分变成黑色
SetTextColor(hdc0,RGB(0,0,0)); // 黑色
//D、透明显示
BitBlt(hdc0,nX0,nY0,nW0,nH0,mDC,0,0,SRCAND); //"与"运算,在hdc0生成掩模
BitBlt(hdc0,nX0,nY0,nW0,nH0,hDC,0,0,SRCPAINT); //"或"运算,生成最终透明效果
//E、以下为释放资源
SelectObject(hDC, oldBMP);
DeleteDC(hDC);
SelectObject(mDC, oldmBMP);
DeleteDC(mDC);
DeleteObject(hBMP);
DeleteObject(mBMP);
}
问题补充:
对于SetBkColor()
SetTextColor()
函数在此的作用无法理解 望解释!
展开
 我来答
魔高丈
2008-12-02 · TA获得超过9506个赞
知道大有可为答主
回答量:2066
采纳率:0%
帮助的人:3468万
展开全部
SetBkColor()和SetTextColor()在这里是设置前景色和背景色的函数(昨天我说错了,这两个函数不光是在字符输出时才有作用的)

下面是我对这段代码的分析:
//C、生成掩码位图。
SetBkColor(hDC, Tcol);// 设置透明色
BitBlt(mDC,0,0,nW0,nH0,hDC,0,0,SRCCOPY);// 生成白色透明区,其它区域为黑色的掩码位图
//执行完这一步后,位图变成有效部分是黑色,透明部分是白色
//mDC里创建的是单色掩码位图,所以只有黑白两种颜色,由于用SetBkColor(hDC, Tcol);将透明色设置为背景,背景色SRCCOPY到目标掩码位图后即为白色,有效部分为黑色

SetBkColor(hDC, RGB(0,0,0)); // 生成黑色透明区,其它区域保持不变的位图
SetTextColor(hDC, RGB(255,255,255)); // 白色
BitBlt(hDC,0,0,nW0,nH0,mDC,0,0,SRCAND);
//执行完这一步后,位图变成有效部分是原来的颜色,透明部分是黑色
//mDC与hDC进行SRCAND(与操作),当hDC的背景色设置为黑色前景色为白色时,mDC(掩码位图)与hDC(原图)进行与操作时,mDC(掩码位图)中背景色(黑色)区域在hDC(原图)中保留下来,而前景色(白色)部分变成了黑色。

////D、透明显示
SetBkColor(hdc0,RGB(255,255,255)); // 透明部分保持屏幕不变,其它部分变成黑色
SetTextColor(hdc0,RGB(0,0,0)); // 黑色
BitBlt(hdc0,nX0,nY0,nW0,nH0,mDC,0,0,SRCAND); //"与"运算,在hdc0生成掩模
//设置hdc0(目标位图)背景色为白色,前景色为黑色,将mDC(掩码位图)与hdc0(目标位图)进行与操作时,hdc0(目标位图)中源位图需要透明的部分被保留住了,而源位图不透明的部分被与成了黑色

BitBlt(hdc0,nX0,nY0,nW0,nH0,hDC,0,0,SRCPAINT); //"或"运算,生成最终透明效果
//至此,两位图进行或运行,合成的图就出来了
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式