現象:使用 GDI+ 實現雙緩沖(離屏 Bitmap → 內存 Graphics → 目標 DC),但畫面仍有明顯閃爍/抖動。
Graphics g(hdc) 導致每幀直接寫入顯存,無雙緩沖效果。// 1. 响應 WM_PAINT
PAINTSTRUCT ps;
HDC hdc = BeginPaint(hwnd, &ps);
// 2. 創建兼容內存 DC 與位圖
HDC memDC = CreateCompatibleDC(hdc);
HBITMAP hBmp = CreateCompatibleBitmap(hdc, clientWidth, clientHeight);
HBITMAP hOldBmp = (HBITMAP)SelectObject(memDC, hBmp);
// 3. 使用 GDI+ 在內存 DC 繪圖
Graphics g(memDC); // 關鍵:綁定內存 DC
g.Clear(Color::White);
g.DrawImage(background, 0, 0);
g.DrawImage(sprite, x, y, srcX, srcY, w, h, UnitPixel);
// 4. 一次性拷貝到螢幕 DC
BitBlt(hdc, 0, 0, clientWidth, clientHeight, memDC, 0, 0, SRCCOPY);
// 5. 清理
SelectObject(memDC, hOldBmp);
DeleteObject(hBmp);
DeleteDC(memDC);
EndPaint(hwnd, &ps);
在窗口類註冊或 WM_ERASEBKGND 返回 TRUE:
case WM_ERASEBKGND:
return TRUE; // 告訴系統:我已在 WM_PAINT 中處理背景,無需擦除
MFC/ATL 提供 CMemDC 自動管理雙緩沖,直接用 CMemDC dc(pDC) 即可。
WM_ERASEBKGND 徹底消除系統擦除閃爍。修正 DC 綁定與繪製順序,雙緩沖才能真正生效。