共用方式為


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隱藏的話。 BeginPaint 隱藏插入號,以避免繪圖作業損毀它。