透過blt



BOOL TransparentBlt(
  hdc hdcDest,
  int nXOrgDest,
  int nYOrgDest,
  int nWidthDest,
  int hHeightDest,
  hdc hdcSrc,
  int nXOrgSrc,
  int nYOrgSrc,
  int nWidthSrc,
  int nHeightSrc,
  COLORREF crTransparent
)
{
  hdc hdcMask, hdcRMask;// マスク用DC
  HBITMAP hBmpMask, hBmpRMask;  // マスク用ビットマップ
  COLORREF crOld;     // 直前の背景色

  hdcMask = CreateCompatibleDC(hdcDest);
  hBmpMask = CreateBitmap(nWidthSrc, nHeightSrc, 1, 1, NULL);
  SaveDC(hdcMask);
  SelectObject(hdcMask, hBmpMask);

  hdcRMask = CreateCompatibleDC(hdcSrc);
  hBmpRMask = CreateCompatibleBitmap(hdcSrc, nWidthSrc, nHeightSrc);
  SaveDC(hdcRMask);
  SelectObject(hdcRMask, hBmpRMask);

  // Mask 作成
  crOld = SetBkColor(hdcSrc, crTransparent);
  BitBlt(hdcMask, 0, 0, nWidthSrc, nHeightSrc, hdcSrc, nXOrgSrc, nYOrgSrc, SRCCOPY); // マスク作成
  SetBkColor(hdcSrc, crOld);

  // (! Mask) & (Src) 透明色以外の部分のデータ作成
  BitBlt(hdcRMask, 0, 0, nWidthSrc, nHeightSrc, hdcSrc, nXOrgSrc, nYOrgSrc, SRCCOPY);
  BitBlt(hdcRMask, 0, 0, nWidthSrc, nHeightSrc, hdcMask, nXOrgSrc, nYOrgSrc, 0x220326); // DSna 

  // 転送
  StretchBlt(hdcDest, nXOrgDest, nYOrgDest, nWidthDest, nHeightDest, hdcMask,  0, 0, nWidthSrc, nHeightSrc, SRCAND);
  StretchBlt(hdcDest, nXOrgDest, nYOrgDest, nWidthDest, nHeightDest, hdcRMask, 0, 0, nWidthSrc, nHeightSrc, SRCINVERT); 

  RestoreDC(hdcMask, -1);
  RestoreDC(hdcRMask, -1);

  DeleteObject(hBmpMask);
  DeleteObject(hBmpRMask);

  return TRUE;
}

VC覚書きページ...