关于透明位图

透明位图网上说了很多,看了半天还是不懂,估计就是因为

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上,为什么?不知道.到此为止了,还算有点收获...

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值