|
|
发表于 2004-11-25 08:59:00
|
显示全部楼层
Re:晕哪!超级郁闷,看不明白,请各位老师讲解!
//**************************************************
// TransparentBlt2 (......)透明显示
// 根据关键色,将hdc1中的图形在hdc0中
// 自动生成掩模,并生成透明图形。
//注:TransparentBlt(......)是一个WIN API函数,功能和这里的相同。在WIN2000和
// 以后的系统上可用。在WIN98中有严重的资源泄漏,根本不能用。
// 所谓的资源泄漏:
// 你把下面TransparentBlt2最后6句注释掉就可看到。
// 要使用TransparentBlt(......)前,请引用:
// #include <wingdi.h>
// #pragma comment (lib,"msimg32.lib")
//**************************************************
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);
} |
|