關於WM_PAINT

大多數Windows程序在WinMain中進入消息循環之前的初始化期間都要呼叫函數UpdateWindow。Windows利用這個機會給窗口消息處理程序發送第一個WM_PAINT消息。這個消息通知窗口消息處理程序:必須繪製顯示區域。此後,窗口消息處理程序應在任何時刻都準備好處理其它WM_PAINT消息,必要的話,甚至重新繪製窗口的整個顯示區域。在發生下面幾種事件之一時,窗口消息處理程序會接收到一個WM_PAINT消息:

  • 在使用者移動窗口或顯示窗口時,窗口中先前被隱藏的區域重新可見。
     
  • 使用者改變窗口的大小(如果窗口類別樣式有着CS_HREDRAW和CS_VREDRAW位旗標的設定)。
     
  • 程序使用ScrollWindow或ScrollDC函數滾動顯示區域的一部分。
     
  • 程序使用InvalidateRect或InvalidateRgn函數刻意產生WM_PAINT消息。
     

在某些情況下,顯示區域的一部分被臨時覆蓋,Windows試圖保存一個顯示區域,並在以後恢復它,但這不一定能成功。在以下情況下,Windows可能發送WM_PAINT消息:

  • Windows擦除覆蓋了部分窗口的對話框或消息框。
     
  • 菜單下拉出來,然後被釋放。
     
  • 顯示工具提示消息。
     

在某些情況下,Windows總是保存它所覆蓋的顯示區域,然後恢復它。這些情況是:

  • 鼠標光標穿越顯示區域。
     
  • 圖標拖過顯示區域。
     

處理WM_PAINT消息要求程序寫作者改變自己向顯示器輸出的思維方式。程序應該組織成可以保留繪製顯示區域需要的所有信息,並且僅當「響應要求」-即Windows給窗口消息處理程序發送WM_PAINT消息時才進行繪製。如果程序在其它時間需要更新其顯示區域,它可以強制Windows產生一個WM_PAINT消息。這看來似乎是在屏幕上顯示內容的一種捨近求遠的方法。但您的程序結構可以從中受益。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章