共用方式為


WM_PAINT訊息

一般而言,應用程式會在視窗中繪製,以回應 WM_PAINT 訊息。 當視窗的變更已改變工作區的內容時,系統會將此訊息傳送至視窗程式。 只有在應用程式訊息佇列中沒有其他訊息時,系統才會傳送訊息。

收到 WM_PAINT 訊息時,應用程式可以呼叫 BeginPaint 來擷取工作區的顯示裝置內容,並在呼叫 GDI 函式時使用它來執行更新工作區所需的任何繪圖作業。 完成繪圖作業之後,應用程式會呼叫 EndPaint 函式來釋放顯示裝置內容。

在 BeginPaint傳回顯示裝置內容之前,系統會為指定的視窗準備裝置內容。 它會先將裝置內容的裁剪區域設定為等於需要更新之視窗部分的交集,以及使用者看得見的部分。 只有已變更之視窗的那些部分會重新繪製。 嘗試在此區域外部繪製會裁剪,且不會出現在畫面上。

系統也可以在BeginPaint傳回之前,將WM_NCPAINTWM_ERASEBKGND訊息傳送至視窗程式。 這些訊息會指示應用程式繪製非工作區和視窗背景。 非工作區是工作區外部視窗的一部分。 區域包括標題列、視窗功能表 (也稱為 [系統 ] 功能表) 和捲軸等功能。 大部分的應用程式都依賴預設視窗函式 DefWindowProc來繪製此區域,因此會將 WM_NCPAINT 訊息傳遞至此函式。 視窗背景是視窗在其他繪圖作業開始之前填入的色彩或圖樣。 背景涵蓋先前在視窗或視窗下畫面上的任何影像。 如果視窗屬於具有類別背景筆刷的視窗類別, DefWindowProc 函 式會自動繪製視窗背景。

BeginPaint 會填入 PAINTSTRUCT 結構,其中包含要更新之視窗部分的維度,以及指出是否已繪製視窗背景的旗標。 應用程式可以使用這項資訊來優化繪圖。 例如,它可以使用 rcPaint 成員所指定的更新區域維度,將繪圖限制為僅需要更新的視窗部分。 如果應用程式有非常簡單的輸出,它可以忽略更新區域並在整個視窗中繪製,依賴系統捨棄 (剪輯) 任何不必要的輸出。 因為系統會裁剪在裁剪區域外部延伸的繪圖,所以只會顯示更新區域中的繪圖。

BeginPaint 會將視窗的更新區域設定為 Null。 這會清除區域,防止它產生後續 WM_PAINT 訊息。 如果應用程式處理 WM_PAINT 訊息,但未呼叫 BeginPaint 或清除更新區域,只要區域不是空的,應用程式就會繼續接收 WM_PAINT 訊息。 在所有情況下,應用程式都必須清除更新區域,才能從 WM_PAINT 訊息傳回。

應用程式完成繪圖之後,它應該會呼叫 EndPaint。 針對大部分的視窗, EndPaint 會釋放顯示裝置內容,使其可供其他視窗使用。 如果 EndPaint 先前由 BeginPaint 隱藏,EndPaint也會顯示插入號。 BeginPaint 會隱藏插入號,以防止繪圖作業損毀。