- 条件:
- the colour image must be black in all areas that we want to display as transparent
- the mask image must be white in the areas we want transparent, and black elsewhere
- 原理:
- SRCAND:Combines the colors of the source and destination rectangles by using the Boolean AND operator.
- SRCPAINT:Combines the colors of the source and destination rectangles by using the Boolean OR operator.
-
SelectObject(hMemDC, hMaskBmp);//mask bmp BitBlt(hdc, 0, 0, cxBmp, cyBmp, hMemDC, 0, 0, SRCAND); SelectObject(hMemDC, hColorBmp);//color bmp BitBlt(hdc, 0, 0, cxBmp, cyBmp, hMemDC, 0, 0, SRCPAINT);
- 代码:
-
HBITMAP CreateBitmapMask(HBITMAP hbmColour, COLORREF crTransparent) { HDC hdcMem, hdcMem2; HBITMAP hbmMask; BITMAP bm; // Create monochrome (1 bit) mask bitmap. GetObject(hbmColour, sizeof(BITMAP), &bm); hbmMask = CreateBitmap(bm.bmWidth, bm.bmHeight, 1, 1, NULL); // Get some HDCs that are compatible with the display driver hdcMem = CreateCompatibleDC(0); hdcMem2 = CreateCompatibleDC(0); SelectObject(hdcMem, hbmColour); SelectObject(hdcMem2, hbmMask); // Set the background colour of the colour image to the colour // you want to be transparent. SetBkColor(hdcMem, crTransparent); // Copy the bits from the colour image to the B+W mask... everything // with the background colour ends up white while everythig else ends up // black...Just what we wanted. BitBlt(hdcMem2, 0, 0, bm.bmWidth, bm.bmHeight, hdcMem, 0, 0, SRCCOPY); // Take our new mask and use it to turn the transparent colour in our // original colour image to black so the transparency effect will // work right. BitBlt(hdcMem, 0, 0, bm.bmWidth, bm.bmHeight, hdcMem2, 0, 0, SRCINVERT); // Clean up. DeleteDC(hdcMem); DeleteDC(hdcMem2); return hbmMask; }
-
static HBITMAP hColorBmp; static HBITMAP hMaskBmp; static int cxBmp; static int cyBmp; case WM_CREATE: { //load bmp and get bmp info hColorBmp = LoadBitmap(GetModuleHandle(NULL),MAKEINTRESOURCE(IDB_BALL)); if (hColorBmp == NULL) { MessageBox(hWnd,L"failed to load color bmp!",NULL,MB_OK); } hMaskBmp = CreateBitmapMask(hColorBmp,RGB(255,255,255)); if (hMaskBmp == NULL) { MessageBox(hWnd,L"failed to create mask bmp!",NULL,MB_OK); } BITMAP bmpInfo; GetObject(hColorBmp,sizeof(BITMAP),&bmpInfo); cxBmp = bmpInfo.bmWidth; cyBmp = bmpInfo.bmHeight; //put window int the middle screen int cxScr = GetSystemMetrics(SM_CXSCREEN); int cyScr = GetSystemMetrics(SM_CYSCREEN); int cxWnd = 400; int cyWnd = 400; MoveWindow(hWnd,(cxScr-cxWnd)/2,(cyScr-cyWnd)/2,cxWnd,cyWnd,TRUE); } break; case WM_PAINT: hdc = BeginPaint(hWnd, &ps); { //bg color RECT rcWnd; HBRUSH hBrush; GetClientRect(hWnd,&rcWnd); hBrush = CreateSolidBrush(RGB(0,128,128)); FillRect(hdc,&rcWnd,hBrush); DeleteObject(hBrush); //disp bmp HDC hMemDC = CreateCompatibleDC(hdc); SelectObject(hMemDC, hMaskBmp); BitBlt(hdc, 73,58, cxBmp, cyBmp, hMemDC, 0, 0, SRCAND); SelectObject(hMemDC, hColorBmp); BitBlt(hdc, 73,58, cxBmp, cyBmp, hMemDC, 0, 0, SRCPAINT); DeleteDC(hMemDC); } EndPaint(hWnd, &ps); break;
-
- 结果:
转载于:https://www.cnblogs.com/dahai/archive/2011/07/11/2102727.html