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

MFC OnSize、OnPaint、OnDraw 三者區別與調用順序詳解

     編輯:程式設計疑難解答

核心區別

消息/函數觸發時機主要用途是否繪圖
OnSize窗口大小改變時調整佈局、重新計算坐標、創建/釋放內存 DC否(通常不直接繪圖)
OnPaint窗口需要重繪(Invalidate、遮擋恢復、最小化還原)處理 WM_PAINT,構造 CPaintDC,調用繪圖邏輯是(SDK 視圖類入口)
OnDraw由 OnPaint(或 CView::OnPaint)調用文檔/視圖架構中實際繪圖代碼放置處,接收 CDC*是(核心繪圖邏輯)

調用鏈與執行順序

  1. 用戶調整窗口大小 → 觸發 WM_SIZE → OnSize 執行(可在此調用 Invalidate 觸發重繪)。
  2. 系統或代碼調用 InvalidateRect → 產生 WM_PAINT → OnPaint 執行。
  3. CView::OnPaint 內部:構造 CPaintDC dc(this) → 準備 DC(映射模式、視口等) → 調用 OnDraw(&dc)。
  4. OnDraw 執行實際繪圖代碼。

代碼復用與重複問題

  • 不會重複:三者職責不同,OnSize 做佈局,OnPaint 做 DC 準備,OnDraw 做業務繪圖。
  • 避免在 OnPaint 寫繪圖邏輯:應將所有繪圖代碼集中在 OnDraw,OnPaint 僅做 DC 構造與調用。
  • 手動觸發重繪:調用 Invalidate() 或 InvalidateRect(),不直接調用 OnDraw。

參考資源

詳細對比可參考:CSDN 博客:OnPaint 與 OnDraw 區別

總結

OnSize 響應尺寸變化,OnPaint 是繪圖入口負責 DC 管理,OnDraw 是繪圖核心邏輯所在。三者分工明確,按順序協作完成 MFC 繪圖流程。

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