WM_PAINT消息解析

  • WM_PAINT消息的產生:當顯示區域(客戶區)存在無效區域時,系統會產生一個WM_PAINT消息,通知視窗處理程序重繪顯示區域。WM_PAINT消息不進入GetMessage(...)的消息隊列,UpdateWindow(...)也不會產生WM_PAINT消息,只是通知系統優先處理WM_PAINT消息。
  • WM_PAINT消息產生的實例:窗口移動或顯示,窗口大小改變,ScrollWindow或ScrollDC滾動顯示區域的一部分,系統擦除覆蓋了部分視窗的對話模塊或消息模塊,功能表下拉出來然後被釋放,顯示工具提示信息 ,用戶使用InvalidateRect或InvalidateRgn使用顯示區域無效。
  • 無效矩形:系統會爲每個視窗保存一個“繪圖資訊結構”,這個結構包含了無效區域的最小矩形的座標及其他資訊。由於WM_PAINT消息的優先級很低,在WndPro(...)處理WM_PAINT消息之前 ,顯示區域有另外一部分變成無效區域時,系統就會重新計算重新包含兩個無效區域的最小矩形,即新的無效矩形,如果消息隊列中存在WM_PAINT時,將不會產生的WM_PAINT消息。在WndPro(...)處理WM_PAINT消息時,可以獲取無效矩形的座標GetUpdateRect();
  • 有效矩形:在WndProc(...)處理WM_PAINT時,BeginPaint之後,整個顯示區域有效。用戶直接使用ValidateRect強行使顯示區域的任意矩形有效,如果顯示區域存在無效矩形且產生的WM_PAINT消息還沒有被處理,而用戶使用ValidateRect使用無效矩形區域有效時,這時系統會刪除消息隊列裏的WM_PAINT消息。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章