在开发界面及棋牌游戏过程中,需要很多镂空的图片,而且图片形式一般比较固定.

所以封装了几种常见的镂空方法.

1. 用于没有掩码图,只有指定透明色,不进行伸缩

C++ 透明位图void DrawTransBitmap( HDC hdcDest,            // 目标DC
C++ 透明位图
                                            int nXOriginDest,       // 目标X偏移
C++ 透明位图
                                            int nYOriginDest,       // 目标Y偏移
C++ 透明位图
                                            int nWidthDest,          // 目标宽度
C++ 透明位图
                                            int nHeightDest,        // 目标高度
C++ 透明位图
                                            HDC hdcSrc,              // 源DC
C++ 透明位图
                                            int nXOriginSrc,         // 源X起点
C++ 透明位图
                                            int nYOriginSrc,         // 源Y起点
C++ 透明位图
                                            COLORREF crTransparent // 透明色,COLORREF类型
C++ 透明位图
                                        );
C++ 透明位图
C++ 透明位图

适用图片:C++ 透明位图

2. 用于没有掩码图,只有指定透明色,可以进行伸缩

C++ 透明位图 void DrawTransBitmap( HDC hdcDest,       // 目标DC
C++ 透明位图
                                             int nXOriginDest,   // 目标X偏移
C++ 透明位图
                                             int nYOriginDest,   // 目标Y偏移
C++ 透明位图
                                             int nWidthDest,      // 目标宽度
C++ 透明位图
                                             int nHeightDest,    // 目标高度
C++ 透明位图
                                             HDC hdcSrc,          // 源DC
C++ 透明位图
                                             int nXOriginSrc,     // 源X起点
C++ 透明位图
                                             int nYOriginSrc,     // 源Y起点
C++ 透明位图
                                             int nWidthSrc,        // 源宽度
C++ 透明位图
                                             int nHeightSrc,      // 源高度
C++ 透明位图
                                             COLORREF crTransparent  // 透明色,COLORREF类型
C++ 透明位图
      );

适用图片:同1,可拉伸

3.指定掩码图,和掩码图属于不同图片

C++ 透明位图 void DrawTransBitmap( HDC hdcDest,        // 目标DC
C++ 透明位图
                                             int nXOriginDest,    // 目标X偏移
C++ 透明位图
                                             int nYOriginDest,    // 目标Y偏移
C++ 透明位图
                                             int nWidthDest,       // 目标宽度
C++ 透明位图
                                             int nHeightDest,     // 目标高度
C++ 透明位图
                                             HDC hdcSrc,          // 源DC
C++ 透明位图
                                             HDC hdcMask,       //掩码DC
C++ 透明位图
                                             int nXOriginSrc,     // 源X起点
C++ 透明位图
                                             int nYOriginSrc,     // 源Y起点
C++ 透明位图
                                            COLORREF crTransparent  // 透明色,COLORREF类型
C++ 透明位图
                                          );

适用图片:C++ 透明位图  和 C++ 透明位图

4.指定图片和掩码图同属于一张图片

C++ 透明位图void DrawTransBitmap(HDC hDC, 
C++ 透明位图                                          
int nPosX, 
C++ 透明位图                                           
int nPosY,
C++ 透明位图                                           
int nCX, 
C++ 透明位图                                           
int nCY, 
C++ 透明位图                                           HBITMAP hObj
                                           );

适用图片:C++ 透明位图

5.得到位图HRGN

   HRGN CreateBitmapRgn(int nWidth,int nHeight,HBITMAP hbmp,COLORREF cTrans);

适用图片:C++ 透明位图

以下是完整代码

 

C++ 透明位图
//用于没有掩码图,只有指定透明色,不进行伸缩
//方法一:
C++ 透明位图
void DrawTransBitmap( HDC hdcDest,      // 目标DC
C++ 透明位图
                    int nXOriginDest,   // 目标X偏移
C++ 透明位图
                    int nYOriginDest,   // 目标Y偏移
C++ 透明位图
                    int nWidthDest,     // 目标宽度
C++ 透明位图
                    int nHeightDest,    // 目标高度
C++ 透明位图
                    HDC hdcSrc,         // 源DC
C++ 透明位图
                    int nXOriginSrc,    // 源X起点
C++ 透明位图
                    int nYOriginSrc,    // 源Y起点
C++ 透明位图
                    COLORREF crTransparent  // 透明色,COLORREF类型
C++ 透明位图
                    )
      if (nHeightSrc < 1) return false;
C++ 透明位图      HDC dc = CreateCompatibleDC(NULL);
C++ 透明位图      HBITMAP bitmap = CreateBitmap(nWidthSrc, nHeightSrc, 1, GetDeviceCaps(dc,
C++ 透明位图      BITSPIXEL), NULL);
C++ 透明位图         }
C++ 透明位图    
C++ 透明位图    HBITMAP oldBitmap = (HBITMAP)SelectObject(dc, bitmap);
C++ 透明位图     }
C++ 透明位图       
C++ 透明位图    HDC maskDC = CreateCompatibleDC(NULL);
C++ 透明位图     HBITMAP maskBitmap = CreateBitmap(nWidthSrc, nHeightSrc, 1, 1, NULL);
C++ 透明位图       }
C++ 透明位图       HBITMAP oldMask =  (HBITMAP)SelectObject(maskDC, maskBitmap);
C++ 透明位图       SetBkColor(maskDC, RGB(0,0,0));
C++ 透明位图       SetTextColor(maskDC, RGB(255,255,255));
C++ 透明位图       }
C++ 透明位图       SetBkColor(dc, crTransparent);
C++ 透明位图       BitBlt(maskDC, 0,0,nWidthSrc,nHeightSrc,dc,0,0,SRCINVERT);
C++ 透明位图      SetBkColor(dc, RGB(0,0,0));
C++ 透明位图       SetTextColor(dc, RGB(255,255,255));
C++ 透明位图       BitBlt(dc, 0,0,nWidthSrc,nHeightSrc,maskDC,0,0,SRCAND);
C++ 透明位图       HDC newMaskDC = CreateCompatibleDC(NULL);
C++ 透明位图       HBITMAP newMask;
C++ 透明位图       newMask = CreateBitmap(nWidthDest, nHeightDest, 1,
C++ 透明位图                                                  GetDeviceCaps(newMaskDC, BITSPIXEL), NULL);
C++ 透明位图       }
C++ 透明位图       SetStretchBltMode(newMaskDC, COLORONCOLOR);
C++ 透明位图       HBITMAP oldNewMask = (HBITMAP) SelectObject(newMaskDC, newMask);
C++ 透明位图       StretchBlt(newMaskDC, 0, 0, nWidthDest, nHeightDest, maskDC, 0, 0,
C++ 透明位图                    nWidthSrc, nHeightSrc, SRCCOPY);
C++ 透明位图       SelectObject(maskDC, oldMask);
C++ 透明位图       DeleteDC(maskDC);
C++ 透明位图       DeleteObject(maskBitmap);
C++ 透明位图       HDC newImageDC = CreateCompatibleDC(NULL);
C++ 透明位图       HBITMAP newImage = CreateBitmap(nWidthDest, nHeightDest, 1,
C++ 透明位图        GetDeviceCaps(newMaskDC, BITSPIXEL), NULL);
C++ 透明位图        }
C++ 透明位图       HBITMAP oldNewImage = (HBITMAP)SelectObject(newImageDC, newImage);
C++ 透明位图       StretchBlt(newImageDC, 0, 0, nWidthDest, nHeightDest, dc, 0, 0, nWidthSrc,
C++ 透明位图              nHeightSrc, SRCCOPY);
C++ 透明位图       SelectObject(dc, oldBitmap);
C++ 透明位图       DeleteDC(dc);
C++ 透明位图       DeleteObject(bitmap);    
C++ 透明位图       BitBlt( dcDest, nXOriginDest, nYOriginDest, nWidthDest, nHeightDest,
C++ 透明位图                          newMaskDC, 0, 0, SRCAND);
C++ 透明位图       BitBlt( dcDest, nXOriginDest, nYOriginDest, nWidthDest, nHeightDest,
C++ 透明位图                       newImageDC, 0, 0, SRCPAINT);
C++ 透明位图       SelectObject(newImageDC, oldNewImage);
C++ 透明位图       DeleteDC(newImageDC);
C++ 透明位图       SelectObject(newMaskDC, oldNewMask);
C++ 透明位图       DeleteDC(newMaskDC);
C++ 透明位图       DeleteObject(newImage);   
C++ 透明位图       DeleteObject(newMask);   
C++ 透明位图       return true;
C++ 透明位图}


 部分摘自:http://blog.csdn.net/xuweiqun/archive/2006/11/11/1378714.aspx,其中还补充了一些平时用到的方法

相关文章: