hmenDC = CreateCompatibleDC(hdc);
hbitmap = CreateCompatibleBitmap(hdc, rect.right, rect.bottom);
SelectObject(hmenDC, hbitmap);
// ... 繪製背景、角色 ...
TransparentBlt(hdc, ..., hmenDC, ..., RGB(255,255,0));
DeleteObject(hbitmap); // 錯誤:對象仍被 DC 選中
DeleteObject(hmenDC);
GDI 規則:**已被 DC 選入的對象不能直接 Delete**,必須先將原對象選回,再刪除新對象。否則對象句柄泄漏,導致後續繪製異常(僅顯示前幾幀)。
HBITMAP hOldBmp = (HBITMAP)SelectObject(hmenDC, hbitmap);
// ... 繪製 ...
SelectObject(hmenDC, hOldBmp); // 恢復原位圖
DeleteObject(hbitmap);
DeleteDC(hmenDC);
WM_CREATE 創建兼容 DC 與位圖,存為窗口數據(SetWindowLongPtr)。WM_PAINT 直接使用緩存 DC 繪製,再 BitBlt 到屏幕 DC。WM_DESTROY 釋放所有 GDI 資源。SetTimer + InvalidateRect 驅動,避免 Sleep 阻塞消息泵。