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

GDI 繪圖閃爍解決:攔截 WM_ERASEBKGND + 雙緩衝

     編輯:程式設計綜合問答

GDI 畫圖收到 `WM_PAINT` 先畫背景再貼圖,拖動視窗閃爍;視頻播放器不閃。

兩招解決

  1. 攔截背景擦除:
    
    case WM_ERASEBKGND:
        return 1; // 告訴系統「我已處理背景」,系統不再填實心刷
    
    在 `WM_PAINT` 內用 `BitBlt` 直接將記憶體 DC 內容一次性複製到螢幕 DC。
  2. 雙緩衝:建立相容 DC + 位圖,所有繪圖操作在記憶體 DC 完成,`WM_PAINT` 只做一次 `BitBlt`。
    
    HDC hMemDC = CreateCompatibleDC(hdc);
    HBITMAP hBmp = CreateCompatibleBitmap(hdc, width, height);
    SelectObject(hMemDC, hBmp);
    // ... 在 hMemDC 畫圖 ...
    BitBlt(hdc, 0, 0, width, height, hMemDC, 0, 0, SRCCOPY);
    DeleteObject(hBmp); DeleteDC(hMemDC);
    

視頻播放器多用 **DirectX / OpenGL / Media Foundation** 直接把解碼幀推到 GPU 表面,繞過 GDI,自然不閃。

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