WM_PAINT訊息

WM_PAINT訊息

功能作用,參數,代碼,

功能作用

顯示區域的顯示內容怎么會變得無效呢?在最初建立視窗的時候,整個顯示區域都是無效的,因為程式還沒有在視窗上畫什麼東西。第一條WM_PAINT訊息(通常發生在WinMain中呼叫UpdateWindow時)指示視窗訊息處理程式在顯示區域上畫一些東西。
在使用者改變HELLOWIN視窗的大小後,顯示區域的顯示內容重新變得無效。讀者應該還記得,HELLOWIN中wndclass結構的style欄位設定為標誌CS_HREDRAW和CS_VREDRAW,這樣的格式設定指示Windows,在視窗大小改變後,就把整個視窗顯示內容當成無效。然後,視窗訊息處理程式將收到一條WM_PAINT訊息。
當使用者將HELLOWIN最小化,然後再次將視窗恢復為以前的大小時,Windows將不會保存顯示區域的內容。在圖形環境下,視窗顯示區域涉及的資料量很大。因此,Windows令視窗無效,視窗訊息處理程式接收一條WM_PAINT訊息,並自動恢復其視窗的內容。
移動視窗以致其相互重疊時,Windows不保存一個視窗中被另一個視窗所遮蓋的內容。在這一部分不再被遮蓋之後,它就被標誌為無效。視窗訊息處理程式接收到一條WM_PAINT訊息,以更新視窗的內容。

參數

對WM_PAINT的處理幾乎總是從一個BeginPaint呼叫開始:
hdc = BeginPaint (hwnd, &ps) ;
而以一個EndPaint呼叫結束:
EndPaint (hwnd, &ps) ;
在這兩個呼叫中,第一個參數都是程式的視窗代號,第二個參數是指向型態為PAINTSTRUCT的結構指標。PAINTSTRUCT結構中包含一些視窗訊息處理程式,可以用來更新顯示區域的內容。我們將在下一章中討論該結構的各個欄位。現在我們只在BeginPaint和EndPaint函式中用到它。
在BeginPaint呼叫中,如果顯示區域的背景還未被刪除,則由Windows來刪除。它使用註冊視窗類別的WNDCLASS結構的hbrBackground欄位中指定的畫刷來刪除背景。在HELLOWIN中, 這是一個白色備用畫刷。這意味著,Windows將通過把視窗背景設定為白色來刪除視窗背景。BeginPaint呼叫令整個顯示區域有效,並傳回一個「裝置內容代號」。裝置內容是指實體輸出設備(如視訊顯示器)及其裝置驅動程式。在視窗的顯示區域顯示文字和圖形需要裝置內容代號。但是從BeginPaint傳回的裝置內容代號不能在顯示區域之外繪圖,讀者可以試一試。EndPaint釋放裝置內容代號,使之不再有效。
如果視窗訊息處理程式不處理WM_PAINT訊息(這是很罕見的),它們必須被傳送給DefWindowProc。DefWindowProc只是依次呼叫BeginPaint和EndPaint,以使顯示區域有效。
呼叫完BeginPaint之後,WndProc接著呼叫GetClientRect:
GetClientRect (hwnd, &rect) ;

代碼

第一個參數是程式視窗的代號。第二個參數是一個指標,指向一個RECT型態的rectangle結構。該結構有四個LONG欄位,分別為left、top、right和bottom。GetClientRect將這四個欄位設定為視窗顯示區域的尺寸。left和top欄位通常設定為0,right和bottom欄位設定為顯示區域的寬度和高度(圖元點數)。

相關詞條

熱門詞條

聯絡我們