| 消息/函數 | 觸發時機 | 主要用途 | 是否繪圖 |
|---|---|---|---|
OnSize | 窗口大小改變時 | 調整佈局、重新計算坐標、創建/釋放內存 DC | 否(通常不直接繪圖) |
OnPaint | 窗口需要重繪(Invalidate、遮擋恢復、最小化還原) | 處理 WM_PAINT,構造 CPaintDC,調用繪圖邏輯 | 是(SDK 視圖類入口) |
OnDraw | 由 OnPaint(或 CView::OnPaint)調用 | 文檔/視圖架構中實際繪圖代碼放置處,接收 CDC* | 是(核心繪圖邏輯) |
WM_SIZE → OnSize 執行(可在此調用 Invalidate 觸發重繪)。InvalidateRect → 產生 WM_PAINT → OnPaint 執行。CView::OnPaint 內部:構造 CPaintDC dc(this) → 準備 DC(映射模式、視口等) → 調用 OnDraw(&dc)。OnDraw 執行實際繪圖代碼。OnSize 做佈局,OnPaint 做 DC 準備,OnDraw 做業務繪圖。OnDraw,OnPaint 僅做 DC 構造與調用。Invalidate() 或 InvalidateRect(),不直接調用 OnDraw。詳細對比可參考:CSDN 博客:OnPaint 與 OnDraw 區別
OnSize 響應尺寸變化,OnPaint 是繪圖入口負責 DC 管理,OnDraw 是繪圖核心邏輯所在。三者分工明確,按順序協作完成 MFC 繪圖流程。