透明位图网上说了很多,看了半天还是不懂,估计就是因为
1.图的颜色取反是个啥意思?
2.SetBkColor是设置字体背景颜色的,用在图上,又是个啥意思?
反正搞了那么多,最后就总结成最精华的5步方法:
1.SetBkColor(原DC, RGB(原图白色,这里就是黑色)),// setbkcolor,作用应该是只会对原图的背景单色产生效果
2.BitBlt(掩DC, 原DC, SRCINVERT/SRCPAINT/SRCCOPY这三种光栅模式都可以)// 将原DC背景区域作画到掩DC,效果颜色是与原图背景色相反的白色// 注:从第二步开始产生透明背景效果
3.BitBlt(目标DC, 原DC, SRCINVERT)// 由1产生的效果,原图单色区域会与目标DC是相同的.
4.BitBlt(目标DC, 掩DC, SRCAND)// 由1,2产生的效果,产生掩DC本色(应该是黑色)透明图
5.BitBlt(目标DC, 原DC, SRVINVERT)// 将原图做到第四步的图,只会选取不同于上图区域的区域取原图作画.
估计看了更不明白,呵呵,反正我也没搞明白.附上部分代码,可以自己试验下.
全局变量:
HDC himage2DC;
HDC hmaskDC;
HDC himageDC;
HDC hmask2DC;
HDC himage3DC;
HDC hmask3DC;
HBITMAP himage2bitmap;
HBITMAP hmaskbitmap;
HBITMAP himagebitmap;
HBITMAP hmask2bitmap;
HBITMAP himage3bitmap;
HBITMAP hmask3bitmap;
初始化函数:
void Init()
{
{
himageDC = CreateCompatibleDC(0);
himagebitmap = (HBITMAP)LoadImage(NULL, "p8_move_orgi.bmp", IMAGE_BITMAP, 64, 128, LR_LOADFROMFILE);
SelectObject(himageDC, himagebitmap);
hmaskDC = CreateCompatibleDC(0);
hmaskbitmap = CreateBitmap(64, 128, 1, 1, NULL);
SelectObject(hmaskDC, hmaskbitmap);
SetBkColor(himageDC, RGB(0, 0, 0));
// SetBkColor(himageDC, RGB(144, 144, 144));
// SetBkColor(hmaskDC, RGB(255, 0, 255));
BitBlt(hmaskDC, 0, 0, 64, 128, himageDC, 0, 0, SRCINVERT);
}
{
himage2DC = CreateCompatibleDC(0);
himage2bitmap = (HBITMAP)LoadImage(NULL, "p8_move_orgi.bmp", IMAGE_BITMAP, 64, 128, LR_LOADFROMFILE);
SelectObject(himage2DC, himage2bitmap);
hmask2DC = CreateCompatibleDC(0);
hmask2bitmap = CreateBitmap(64, 128, 1, 1, NULL);
SelectObject(hmask2DC, hmask2bitmap);
BitBlt(hmask2DC, 0, 0, 64, 128, himage2DC, 0, 0, SRCCOPY);
}
{
himage3DC = CreateCompatibleDC(0);
himage3bitmap = (HBITMAP)LoadImage(NULL, "p8_move_orgi.bmp", IMAGE_BITMAP, 64, 128, LR_LOADFROMFILE);
SelectObject(himage3DC, himage3bitmap);
hmask3DC = CreateCompatibleDC(0);
hmask3bitmap = CreateBitmap(64, 128, 1, 1, NULL);
SelectObject(hmask3DC, hmask3bitmap);
}
}
WM_PAINT消息响应加上这段代码:
case WM_PAINT:
BeginPaint(hWnd, &ps);
// setbk(imageDC, RGB(255,255,255)) && bitblt(maskDC, imageDC)
BitBlt(ps.hdc, 600, 0, 64, 128, himageDC, 0, 0, SRCCOPY);
BitBlt(ps.hdc, 450, 0, 64, 128, hmaskDC, 0, 0, SRCCOPY);
BitBlt(ps.hdc, 0, 0, 64, 128, himageDC, 0, 0, SRCINVERT);
BitBlt(ps.hdc, 0, 0, 64, 128, hmaskDC, 0, 0, SRCAND);
BitBlt(ps.hdc, 0, 0, 64, 128, himageDC, 0, 0, SRCINVERT);
BitBlt(ps.hdc, 150, 0, 64, 128, himageDC, 0, 0, SRCINVERT);
BitBlt(ps.hdc, 150, 0, 64, 128, hmaskDC, 0, 0, SRCAND);
BitBlt(ps.hdc, 300, 0, 64, 128, himageDC, 0, 0, SRCINVERT);
// bitblt(maskDC, imageDC)
BitBlt(ps.hdc, 0, 150, 64, 128, himage2DC, 0, 0, SRCINVERT);
BitBlt(ps.hdc, 0, 150, 64, 128, hmask2DC, 0, 0, SRCAND);
BitBlt(ps.hdc, 0, 150, 64, 128, himage2DC, 0, 0, SRCINVERT);
BitBlt(ps.hdc, 150, 150, 64, 128, himage2DC, 0, 0, SRCINVERT);
BitBlt(ps.hdc, 150, 150, 64, 128, hmask2DC, 0, 0, SRCAND);
BitBlt(ps.hdc, 300, 150, 64, 128, himage2DC, 0, 0, SRCINVERT);
// no setbk or bitblt
BitBlt(ps.hdc, 0, 300, 64, 128, himage3DC, 0, 0, SRCINVERT);
BitBlt(ps.hdc, 0, 300, 64, 128, hmask3DC, 0, 0, SRCAND);
BitBlt(ps.hdc, 0, 300, 64, 128, himage3DC, 0, 0, SRCINVERT);
BitBlt(ps.hdc, 150, 300, 64, 128, himage3DC, 0, 0, SRCINVERT);
BitBlt(ps.hdc, 150, 300, 64, 128, hmask3DC, 0, 0, SRCAND);
BitBlt(ps.hdc, 300, 300, 64, 128, himage3DC, 0, 0, SRCINVERT);
EndPaint(hWnd, &ps);
break;
搞了半天,终于发现了点别人没有发现的东西,原来原图底色是什么颜色都可以,就是不能要白色,白色的setbkcolor必须设置成黑色,要不免谈,好像是因为白色的底色画不到目标DC上,为什么?不知道.到此为止了,还算有点收获...