画一个透明背景的位图

 

//  该函数摘自MSDN.

void  DrawTransparentBitmap(HDC hdc, HBITMAP hBitmap,  short  xStart,
                           
short  yStart, COLORREF cTransparentColor)
{
   BITMAP     bm;
   COLORREF   cColor;
   HBITMAP    bmAndBack, bmAndObject, bmAndMem, bmSave;
   HBITMAP    bmBackOld, bmObjectOld, bmMemOld, bmSaveOld;
   HDC        hdcMem, hdcBack, hdcObject, hdcTemp, hdcSave;
   POINT      ptSize;

   hdcTemp 
= CreateCompatibleDC(hdc);
   SelectObject(hdcTemp, hBitmap);   
// Select the bitmap

   GetObject(hBitmap, 
sizeof(BITMAP), (LPSTR)&bm);
   ptSize.x 
= bm.bmWidth;            // Get width of bitmap
   ptSize.y = bm.bmHeight;           // Get height of bitmap
   DPtoLP(hdcTemp, &ptSize, 1);      // Convert from device

                                     
// to logical points

   
// Create some DCs to hold temporary data.
   hdcBack   = CreateCompatibleDC(hdc);
   hdcObject 
= CreateCompatibleDC(hdc);
   hdcMem    
= CreateCompatibleDC(hdc);
   hdcSave   
= CreateCompatibleDC(hdc);

   
// Create a bitmap for each DC. DCs are required for a number of
   
// GDI functions.

   
// Monochrome DC
   bmAndBack   = CreateBitmap(ptSize.x, ptSize.y, 11, NULL);

   
// Monochrome DC
   bmAndObject = CreateBitmap(ptSize.x, ptSize.y, 11, NULL);

   bmAndMem    
= CreateCompatibleBitmap(hdc, ptSize.x, ptSize.y);
   bmSave      
= CreateCompatibleBitmap(hdc, ptSize.x, ptSize.y);

   
// Each DC must select a bitmap object to store pixel data.
   bmBackOld   = (HBITMAP)::SelectObject(hdcBack, bmAndBack);
   bmObjectOld 
= (HBITMAP)::SelectObject(hdcObject, bmAndObject);
   bmMemOld    
= (HBITMAP)::SelectObject(hdcMem, bmAndMem);
   bmSaveOld   
= (HBITMAP)::SelectObject(hdcSave, bmSave);

   
// Set proper mapping mode.
   SetMapMode(hdcTemp, GetMapMode(hdc));

   
// Save the bitmap sent here, because it will be overwritten.
   BitBlt(hdcSave, 00, ptSize.x, ptSize.y, hdcTemp, 00, SRCCOPY);

   
// Set the background color of the source DC to the color.
   
// contained in the parts of the bitmap that should be transparent
   cColor = SetBkColor(hdcTemp, cTransparentColor);

   
// Create the object mask for the bitmap by performing a BitBlt
   
// from the source bitmap to a monochrome bitmap.
   BitBlt(hdcObject, 00, ptSize.x, ptSize.y, hdcTemp, 00,
          SRCCOPY);

   
// Set the background color of the source DC back to the original
   
// color.
   SetBkColor(hdcTemp, cColor);

   
// Create the inverse of the object mask.
   BitBlt(hdcBack, 00, ptSize.x, ptSize.y, hdcObject, 00,
          NOTSRCCOPY);

   
// Copy the background of the main DC to the destination.
   BitBlt(hdcMem, 00, ptSize.x, ptSize.y, hdc, xStart, yStart,
          SRCCOPY);

   
// Mask out the places where the bitmap will be placed.
   BitBlt(hdcMem, 00, ptSize.x, ptSize.y, hdcObject, 00, SRCAND);

   
// Mask out the transparent colored pixels on the bitmap.
   BitBlt(hdcTemp, 00, ptSize.x, ptSize.y, hdcBack, 00, SRCAND);

   
// XOR the bitmap with the background on the destination DC.
   BitBlt(hdcMem, 00, ptSize.x, ptSize.y, hdcTemp, 00, SRCPAINT);

   
// Copy the destination to the screen.
   BitBlt(hdc, xStart, yStart, ptSize.x, ptSize.y, hdcMem, 00,
          SRCCOPY);

   
// Place the original bitmap back into the bitmap sent here.
   BitBlt(hdcTemp, 00, ptSize.x, ptSize.y, hdcSave, 00, SRCCOPY);

   
// Delete the memory bitmaps.
   DeleteObject(SelectObject(hdcBack, bmBackOld));
   DeleteObject(SelectObject(hdcObject, bmObjectOld));
   DeleteObject(SelectObject(hdcMem, bmMemOld));
   DeleteObject(SelectObject(hdcSave, bmSaveOld));

   
// Delete the memory DCs.
   DeleteDC(hdcMem);
   DeleteDC(hdcBack);
   DeleteDC(hdcObject);
   DeleteDC(hdcSave);
   DeleteDC(hdcTemp);
}
 

你可能感兴趣的:(画一个透明背景的位图)