首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Win32 雙緩衝繪圖僅顯示部分位圖:GDI 對象選入/釋放順序錯誤

     編輯:程式設計綜合問答

錯誤代碼片段

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);

完整幀循環建議

  1. WM_CREATE 創建兼容 DC 與位圖,存為窗口數據(SetWindowLongPtr)。
  2. WM_PAINT 直接使用緩存 DC 繪製,再 BitBlt 到屏幕 DC。
  3. WM_DESTROY 釋放所有 GDI 資源。
  4. 動畫用 SetTimer + InvalidateRect 驅動,避免 Sleep 阻塞消息泵。
  1. 上一篇文章:
  2. 下一篇文章:
Visual Studio 2012 重裝後創建控制台應用程式出現錯誤的解決方案 MySQL 存儲過程刪除關聯表數據:外鍵約束與事務 Struts2 <s:iterator> 標籤為何能直接用 EL 表達式取值? Android 讀取相冊圖片:使用 Intent.ACTION_PICK 讓系統選圖器返回 URI Java 抽象類的核心價值:定義共同行為與實現多態 HTML 頁面中可放置多組