WM_PAINT訊息

當系統或其他應用程式提出繪製應用程式視窗部分的要求時,就會傳送 WM_PAINT 訊息。 呼叫UpdateWindowRedrawWindow函式時,或是當應用程式使用GetMessagePeekMessage函式取得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_PRINTWM_PRINTCLIENT 訊息。 請注意,這需要目標視窗來支援 WM_PRINTCLIENT 訊息。 最常見的控制項支援 WM_PRINTCLIENT 訊息。

DefWindowProc函式會驗證更新區域。 如果必須繪製視窗框架,則函式也可以將 WM_NCPAINT 訊息傳送至視窗程式,並在必須清除視窗背景時傳送 WM_ERASEBKGND 訊息。

當應用程式訊息佇列中沒有其他訊息時,系統會傳送此訊息。 DispatchMessage 會決定傳送訊息的位置; GetMessage 會決定要分派的訊息。 當應用程式訊息佇列中沒有其他訊息時,GetMessage會傳回WM_PAINT訊息,而 DispatchMessage會將訊息傳送至適當的視窗程式。

視窗可能會因為呼叫 RedrawWindow 而收到內部繪製訊息,並設定RDW_INTERNALPAINT旗標。 在此情況下,視窗可能沒有更新區域。 應用程式可能會呼叫 GetUpdateRect 函式,以判斷視窗是否有更新區域。 如果 GetUpdateRect 傳回零,則應用程式不需要呼叫 BeginPaintEndPaint 函式。

應用程式必須查看每個 WM_PAINT 訊息的內部資料結構,檢查是否有任何必要的內部繪製,因為 WM_PAINT訊息可能是 由非 Null 更新區域所造成,以及呼叫已設定RDW_INTERNALPAINT旗標的 RedrawWindow 所造成。

系統只會傳送內部 WM_PAINT 訊息一次。 從GetMessagePeekMessage傳回內部WM_PAINT訊息,或透過UpdateWindow傳送至視窗之後,系統不會張貼或傳送進一步的WM_PAINT訊息,直到視窗失效或RedrawWindow再次呼叫,並設定RDW_INTERNALPAINT旗標。

對於某些常見的控制項,預設 WM_PAINT 訊息處理會檢查 wParam 參數。 如果 wParam 不是 Null,控制項會假設此值為 HDC,並使用該裝置內容繪製。

規格需求

需求
最低支援的用戶端
Windows 2000 專業版 [僅限傳統型應用程式]
最低支援的伺服器
Windows 2000 Server [僅限傳統型應用程式]
標頭
Winuser.h (包含 Windows.h)

另請參閱

繪製和繪圖概觀

繪製和繪製訊息

BeginPaint

DefWindowProc

DispatchMessage

EndPaint

GetMessage

GetUpdateRect

PeekMessage

RedrawWindow

UpdateWindow

WM_ERASEBKGND

WM_NCPAINT

WM_PRINT

WM_PRINTCLIENT