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

MFC 繪圖流程澄清:OnSize 觸發 WM_PAINT 進而調用 OnPaint,而非直接調用 OnDraw

     編輯:程式設計疑難解答

正確調用鏈

OnSize() 
  → 窗口無效化 (InvalidateRect) 
  → 發送 WM_PAINT 
  → CWnd::OnPaint() 
    → CPaintDC dc(this) // 自動 BeginPaint/EndPaint
    → OnPrepareDC(&dc)
    → OnDraw(&dc)       // 視圖類虛函數,實際繪圖邏輯在這裡

常見誤區

❌ OnSize → OnDraw → OnPaint(順序錯誤,OnDraw 是 OnPaint 內部調用)
✅ OnSize → WM_PAINT → OnPaint → OnDraw

關鍵區別

函數所屬類職責
OnSizeCWnd響應尺寸變化,調整佈局、滾動條、子窗口位置
OnPaintCWnd處理 WM_PAINT,構造 CPaintDC,調用 OnDraw
OnDrawCView核心繪圖邏輯,由框架在繪圖上下文中調用

最佳實踐

  • 在 OnSize 中調整滾動範圍:SetScrollSizes(MM_TEXT, totalSize)。
  • 繪圖代碼只寫在 OnDraw,利用 pDC->GetClipBox 實現增量更新。
  • 需立即重繪時調用 Invalidate() 或 RedrawWindow(),不要直接調用 OnDraw。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved