CvvImage img; img.CopyOf(m_pImgIn, m_pImgIn->nChannels); CRect rc(0, 0, m_pImgIn->width, m_pImgIn->height); CDC dcDest; dcDest.CreateCompatibleDC(pDC); CBitmap bmp; bmp.CreateCompatibleBitmap(pDC, m_pImgIn->width, m_pImgIn->height); dcDest.SelectObject(&bmp); img.DrawToHDC(dcDest.GetSafeHdc(), rc); CBitmap bmpTmp; bmpTmp.LoadBitmap(IDB_BITMAP_FOREGND); CDC dcFg; dcFg.CreateCompatibleDC(&dcDest); dcFg.SelectObject(&bmpTmp); // m_bmpFg中保存了将要被镂空后嵌入背景的图片 BITMAP bm; m_bmpFg.GetBitmap(&bm); int nWidth = bm.bmWidth; int nHeight = bm.bmHeight; // 创建兼容位图 CBitmap bmpImage, *pBmpImage; bmpImage.CreateCompatibleBitmap(&dcDest, rc.Width(), rc.Height()); // 创建单色掩码位图 CBitmap bmpMask, *pBmpMask; bmpMask.CreateBitmap(nWidth, nHeight, 1, 1, NULL); CDC dcImage; dcImage.CreateCompatibleDC(&dcDest); CDC dcMask; dcMask.CreateCompatibleDC(&dcDest); pBmpImage = (CBitmap*)(dcImage.SelectObject(&bmpImage)); pBmpMask = (CBitmap*)(dcMask.SelectObject(&bmpMask)); dcImage.BitBlt(0, 0, nWidth, nHeight, &dcFg, 0, 0, SRCCOPY); // 设置透明色 COLORREF clrTransparent = RGB(192, 192, 192); dcImage.SetBkColor(clrTransparent); // 生成透明区域为白色,其它区域为黑色的掩码位图 dcMask.BitBlt(0, 0, nWidth, nHeight, &dcImage, 0, 0, SRCCOPY); // 生成透明区域为黑色,其它区域保持不变的位图 dcImage.SetBkColor(RGB(0, 0, 0)); dcImage.SetTextColor(RGB(255, 255, 255)); dcImage.BitBlt(0, 0, nWidth, nHeight, &dcMask, 0, 0, SRCAND); int nOutPosX = 50; int nOutPosY = 100; // 透明部分保持屏幕不变,其它部分变成黑色 dcDest.SetBkColor(RGB(255, 255, 255)); dcDest.SetTextColor(RGB(0, 0, 0)); dcDest.BitBlt(nOutPosX, nOutPosY, nWidth, nHeight, &dcMask, 0, 0, SRCAND); // "或"运算,生成最终效果 dcDest.BitBlt(nOutPosX, nOutPosY, nWidth, nHeight, &dcImage, 0, 0, SRCPAINT); pDC->BitBlt(0, 0, rc.Width(), rc.Height(), &dcDest, 0, 0, SRCCOPY); dcImage.SelectObject(pBmpImage); dcImage.DeleteDC(); dcMask.SelectObject(pBmpMask); dcMask.DeleteDC(); bmpImage.DeleteObject(); bmpMask.DeleteObject();