在 MFC 應用程式中自繪標題欄文字(如「菜單」),需即時追蹤滑鼠位置並變色顯示。直接在 OnNcPaint 中先覆蓋舊文字再繪製新文字,導致明顯閃爍。
螢幕直接繪圖(即時模式)會讓使用者看到「清除→重繪」的中間過程,產生閃爍。
核心思想:在記憶體位圖(Off-screen Bitmap)上完成所有繪圖操作,最後一次性複製到螢幕 DC。
CDC memDC; CBitmap bmp; memDC.CreateCompatibleDC(pDC); bmp.CreateCompatibleBitmap(pDC, width, height);CBitmap* pOldBmp = memDC.SelectObject(&bmp); memDC.FillSolidRect(..., GetSysColor(COLOR_3DFACE));memDC 上繪製所有元素(文字、圖示、滑鼠懸停效果)。pDC->BitBlt(0, 0, width, height, &memDC, 0, 0, SRCCOPY);memDC.SelectObject(pOldBmp);OnNcCalcSize 中調整非客戶區大小,確保有足夠區域繪製自訂內容。InvalidateRect 或 RedrawWindow 觸發 WM_NCPAINT,配合雙緩衝即可無閃爍更新。CMFCVisualManager 簡化主題繪製。採用雙緩衝後,標題欄文字變色切換將平滑無閃爍,體驗大幅提升。