首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> VC >> 關於VC++

MFC 繪圖技巧:利用 BitBlt 實現鏤空圖效果

     編輯:關於VC++

鏤空圖繪製原理

鏤空圖(透明遮罩效果)需兩步光柵運算:

  1. 遮罩與背景做 AND 運算,保留背景中非遮罩區域
  2. 前景圖與結果做 OR 運算,合成最終圖像

核心程式碼實作

// 取得客戶區大小
CRect rect;
GetClientRect(&rect);

// 建立相容記憶體 DC
CDC memDC;
memDC.CreateCompatibleDC(pDC);

// 載入背景圖與人物圖(含遮罩,左右並排)
CBitmap bgBmp, manBmp;
bgBmp.m_hObject = (HBITMAP)::LoadImage(nullptr, L"b1.bmp", IMAGE_BITMAP,
    rect.right, rect.bottom, LR_LOADFROMFILE);
manBmp.m_hObject = (HBITMAP)::LoadImage(nullptr, L"man.bmp", IMAGE_BITMAP,
    208, 154, LR_LOADFROMFILE);

// 1. 繪製背景
memDC.SelectObject(bgBmp);
pDC->BitBlt(0, 0, rect.right, rect.bottom, &memDC, 0, 0, SRCCOPY);

// 2. 遮罩 AND 操作(假設遮罩在圖片右半部 104x154)
memDC.SelectObject(manBmp);
pDC->BitBlt(250, 150, 104, 154, &memDC, 104, 0, SRCAND);

// 3. 前景 OR 操作(左半部為實際圖像)
pDC->BitBlt(250, 150, 104, 154, &memDC, 0, 0, SRCPAINT);

關鍵點說明

  • man.bmp 寬 208 像素:左 104 像素為彩色圖像,右 104 像素為單色遮罩(白=透明,黑=不透明)
  • SRCAND:目標 = 目標 AND 來源 → 遮罩黑處保留背景,白處清零
  • SRCPAINT:目標 = 目標 OR 來源 → 將前景色填入先前清零區域

此技巧廣泛用於 2D 遊戲精靈渲染、UI 非矩形視窗等場景。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved