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

MFC 繪圖擦除波紋圖不閃爍:雙緩衝 + 透明色重繪擦除法

     編輯:程式設計疑難解答

問題

窗口內畫波紋圖,全刷 `Invalidate()` 會閃爍,需僅擦除舊波紋(標線、點)不影響背景。

方案:雙緩衝 + 記錄幾何體擦除

  1. 內存 DC 繪圖:創建兼容位圖,所有繪圖操作在內存 DC 完成,最後 `BitBlt` 到屏幕 DC。
  2. 記錄上一幀圖元:用結構體/類保存每條波紋的關鍵點座標、顏色、線寬。
  3. 擦除邏輯:
    • 在內存 DC 上,用**背景色筆刷/筆**重繪上一幀波紋幾何體(即「反向繪製」),覆蓋掉舊像素。
    • 或用透明色(`SetBkMode(TRANSPARENT)` + 背景色筆)重繪。
    • 再繪製新一幀波紋。
  4. 一次性呈現:`BitBlt` 內存 DC → 屏幕 DC,無閃爍。

核心代碼片段

void CWaveView::OnDraw(CDC* pDC) {
    // 1. 雙緩衝
    CMemDC memDC(pDC); // MFC 封裝或手動 CreateCompatibleDC/Bitmap
    
    // 2. 擦除上一幀
    for (auto& wave : m_prevWaves) {
        CPen pen(PS_SOLID, wave.width, wave.bgColor); // 背景色筆
        CPen* pOld = memDC.SelectObject(&pen);
        memDC.Polyline(wave.points); // 重繪舊幾何體即擦除
        memDC.SelectObject(pOld);
    }
    m_prevWaves.clear();
    
    // 3. 繪製新幀並記錄
    for (auto& wave : m_curWaves) {
        CPen pen(PS_SOLID, wave.width, wave.color);
        CPen* pOld = memDC.SelectObject(&pen);
        memDC.Polyline(wave.points);
        memDC.SelectObject(pOld);
        m_prevWaves.push_back(wave); // 保存供下幀擦除
    }
    // 4. BitBlt 已在 CMemDC 構造/析構中自動完成
}

關鍵類定義

struct WaveData {
    std::vector points;
    COLORREF color;
    COLORREF bgColor; // 通常為窗口背景色 GetSysColor(COLOR_WINDOW)
    int width;
};
std::vector m_prevWaves, m_curWaves;

總結

雙緩衝消除閃爍,記錄幾何體用背景色重繪實現精準擦除,是 MFC 動態波形繪圖標準模式。

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