关于透明位图

    技术2022-05-20  40

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

    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)