WM_PAINT消息

WndProc處理的第二個消息爲WM_PAINT。這個消息在Windows程序設計中是很重要的。當窗口顯示區域的一部分顯示內容或者全部變爲 “無效”,以致於必須“更新畫面”時,將由這個消息通知程序。
  顯示區域的顯示內容怎麼會變得無效呢?在最初建立窗口的時候,整個顯示區域都是無效的,因爲程序還沒有在窗口上畫什麼東西。第一條 WM_PAINT消息(通常發生在WinMain中調用UpdateWindow時)指示窗口消息處理程序在顯示區域上畫一些東西。在用戶改變 HELLOWIN窗口的大小後,顯示區域的顯示內容重新變得無效。wndclass結構的style字段設定爲標誌 CS_HREDRAW和CS_VREDRAW,這樣的格式設定指示Windows,在窗口大小改變後,就把整個窗口顯示內容當成無效。然後,窗口消息處理 程序將收到一條WM_PAINT消息。當用戶將最小化,然後再次將窗口恢復爲以前的大小時,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字段中指定的畫刷來刪除背景。一般, 這是一個白色備用畫刷。這意味着,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字段設定爲顯示區域的寬度和高度(像素點數)。WndProc除了將該 RECT結構指針作爲DrawText的第四個參數傳遞外,不再對它做其它處理

發佈了12 篇原創文章 · 獲贊 13 · 訪問量 10萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章