WM_PAINT訊息
當系統或其他應用程式提出繪製應用程式視窗部分的要求時,就會傳送 WM_PAINT 訊息。 呼叫UpdateWindow或RedrawWindow函式時,或是當應用程式使用GetMessage或PeekMessage函式取得WM_PAINT訊息時,就會傳送訊息。
視窗會透過其 WindowProc 函式接收此訊息。
LRESULT CALLBACK WindowProc(
HWND hwnd,
UINT uMsg,
WPARAM wParam,
LPARAM lParam
);
-
wParam
-
不使用這個參數。
-
lParam
-
不使用這個參數。
如果應用程式處理此訊息,應用程式會傳回零。
LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch (uMsg)
{
case WM_DESTROY:
PostQuitMessage(0);
return 0;
case WM_PAINT:
{
PAINTSTRUCT ps;
HDC hdc = BeginPaint(hwnd, &ps);
// All painting occurs here, between BeginPaint and EndPaint.
FillRect(hdc, &ps.rcPaint, (HBRUSH) (COLOR_WINDOW+1));
EndPaint(hwnd, &ps);
}
return 0;
}
return DefWindowProc(hwnd, uMsg, wParam, lParam);
}
GitHub 上的 Windows 傳統範例 範例範例。
WM_PAINT訊息是由系統產生,不應該由應用程式傳送。 若要強制視窗繪製到特定裝置內容,請使用 WM_PRINT 或 WM_PRINTCLIENT 訊息。 請注意,這需要目標視窗來支援 WM_PRINTCLIENT 訊息。 最常見的控制項支援 WM_PRINTCLIENT 訊息。
DefWindowProc函式會驗證更新區域。 如果必須繪製視窗框架,則函式也可以將 WM_NCPAINT 訊息傳送至視窗程式,並在必須清除視窗背景時傳送 WM_ERASEBKGND 訊息。
當應用程式訊息佇列中沒有其他訊息時,系統會傳送此訊息。 DispatchMessage 會決定傳送訊息的位置; GetMessage 會決定要分派的訊息。 當應用程式訊息佇列中沒有其他訊息時,GetMessage會傳回WM_PAINT訊息,而 DispatchMessage會將訊息傳送至適當的視窗程式。
視窗可能會因為呼叫 RedrawWindow 而收到內部繪製訊息,並設定RDW_INTERNALPAINT旗標。 在此情況下,視窗可能沒有更新區域。 應用程式可能會呼叫 GetUpdateRect 函式,以判斷視窗是否有更新區域。 如果 GetUpdateRect 傳回零,則應用程式不需要呼叫 BeginPaint 和 EndPaint 函式。
應用程式必須查看每個 WM_PAINT 訊息的內部資料結構,檢查是否有任何必要的內部繪製,因為 WM_PAINT訊息可能是 由非 Null 更新區域所造成,以及呼叫已設定RDW_INTERNALPAINT旗標的 RedrawWindow 所造成。
系統只會傳送內部 WM_PAINT 訊息一次。 從GetMessage或PeekMessage傳回內部WM_PAINT訊息,或透過UpdateWindow傳送至視窗之後,系統不會張貼或傳送進一步的WM_PAINT訊息,直到視窗失效或RedrawWindow再次呼叫,並設定RDW_INTERNALPAINT旗標。
對於某些常見的控制項,預設 WM_PAINT 訊息處理會檢查 wParam 參數。 如果 wParam 不是 Null,控制項會假設此值為 HDC,並使用該裝置內容繪製。
需求 | 值 |
---|---|
最低支援的用戶端 |
Windows 2000 專業版 [僅限傳統型應用程式] |
最低支援的伺服器 |
Windows 2000 Server [僅限傳統型應用程式] |
標頭 |
|