Windows 提供設備相關位圖(DDB)與設備無關位圖(DIB)兩種位圖機制。DDB 適合螢幕快速繪製,DIB 適合跨裝置保存與列印。本文示範 `CBitmap::LoadBitmap` 載入資源 DDB、記憶體 DC 配合 `BitBlt`/`StretchBlt` 高效繪製,並完整列舉 15 種光柵操作(ROP)代碼與效果。
void CMyView::OnDraw(CDC* pDC) {
CDC memDC;
memDC.CreateCompatibleDC(pDC); // 建立相容記憶體 DC
CBitmap bmp;
bmp.LoadBitmap(IDB_MY_BITMAP); // 從資源載入 DDB
CBitmap* pOldBmp = memDC.SelectObject(&bmp); // 選入記憶體 DC
BITMAP bm;
bmp.GetBitmap(&bm); // 取得寬高
// 等比例複製
pDC->BitBlt(10, 10, bm.bmWidth, bm.bmHeight, &memDC, 0, 0, SRCCOPY);
// 或縮放繪製
// pDC->StretchBlt(10, 10, 200, 150, &memDC, 0, 0, bm.bmWidth, bm.bmHeight, SRCCOPY);
memDC.SelectObject(pOldBmp); // 還原
}
| 代碼 | 效果 |
|---|---|
| SRCCOPY | 直接複製源到目標(最常用) |
| SRCAND | 源 AND 目標 |
| SRCPAINT | 源 OR 目標 |
| SRCINVERT | 源 XOR 目標 |
| SRCERASE | 源 AND (NOT 目標) |
| NOTSRCCOPY | 複製源的反色 |
| NOTSRCERASE | (NOT 源) AND (NOT 目標) |
| MERGECOPY | 圖案 AND 源 |
| MERGEPAINT | (NOT 源) OR 目標 |
| PATCOPY | 複製圖案到目標 |
| PATPAINT | 圖案 OR 目標 |
| PATINVERT | 圖案 XOR 目標 |
| DSTINVERT | 反轉目標 |
| BLACKNESS | 全黑 |
| WHITENESS | 全白 |