窗口內畫波紋圖,全刷 `Invalidate()` 會閃爍,需僅擦除舊波紋(標線、點)不影響背景。
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 動態波形繪圖標準模式。