在 MFC 應用中,使用 OnDraw 根據採集數據繪製圖表時,每次刷新需要清除上一次的繪圖內容。數據屬於不同列,如何高效實現「擦除舊數據、繪製新數據」?
BitBlt 到螢幕 DC,消除閃爍。std::vector)。FillSolidRect 整個客戶區,配合雙緩衝無閃爍。InvalidateRect,配合 WM_ERASEBKGND 返回 TRUE 禁止默認擦除,在 OnDraw 中先用背景筆刷覆蓋舊區域,再繪製新數據。// OnDraw 簡略邏輯
void CMyView::OnDraw(CDC* pDC) {
// 1. 建立兼容 DC 與位圖(雙緩衝)
CMemDC memDC(pDC); // MFC 封裝類或自行實現
// 2. 擦除上一幀區域(若採用精細擦除)
for (auto& rect : m_prevRects) {
memDC.FillSolidRect(rect, GetSysColor(COLOR_WINDOW));
}
m_prevRects.clear();
// 3. 繪製所有列數據
for (auto& series : m_dataSeries) {
CPen pen(PS_SOLID, 1, series.color);
CPen* pOld = memDC.SelectObject(&pen);
// Polyline 等繪圖...
memDC.SelectObject(pOld);
// 記錄本幀佔用矩形供下一次擦除
m_prevRects.push_back(series.GetBoundingRect());
}
}
可參考百度知道相關源碼示例:MFC 繪圖擦除源碼
結合雙緩衝與區域無效化/重繪,即可實現流暢、無閃爍的多列數據動態繪圖與擦除。