WM_PAINT メッセージ

WM_PAINT メッセージは、システムまたは別のアプリケーションがアプリケーションのウィンドウの一部を塗りつぶす要求を行うと送信されます。 メッセージは、UpdateWindow 関数または RedrawWindow 関数が呼び出されたとき、またはアプリケーションが GetMessage または PeekMessage 関数を使用してWM_PAINT メッセージを取得したときに DispatchMessage 関数によって送信されます。

ウィンドウは、WindowProc 関数を介してこのメッセージを受け取ります。

LRESULT CALLBACK WindowProc(
  HWND hwnd, 
  UINT  uMsg, 
  WPARAM wParam, 
  LPARAM lParam     
);

パラメーター

wParam

このパラメーターは使用されません。

lParam

このパラメーターは使用されません。

戻り値

このメッセージを処理すると、アプリケーションから 0 が返されます。

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 は メッセージを適切なウィンドウ プロシージャに送信します。

ウィンドウは、RDW_INTERNALPAINT フラグを設定して RedrawWindow を呼び出した結果、内部ペイント メッセージを受信する場合があります。 この場合、ウィンドウに更新リージョンがない可能性があります。 アプリケーションは GetUpdateRect 関数を呼び出して、ウィンドウに更新領域があるかどうかを判断できます。 GetUpdateRect が 0 を返す場合、アプリケーションは BeginPaint 関数と EndPaint 関数を呼び出す必要はありません。

WM_PAINT メッセージは NULL 以外の更新領域と、RDW_INTERNALPAINT フラグが設定された RedrawWindow の呼び出しの両方によって発生している可能性があるため、アプリケーションは、各WM_PAINT メッセージの内部データ構造を調べることで、必要な内部描画をチェックする必要があります。

システムは内部WM_PAINTメッセージを 1 回だけ送信します。 内部WM_PAINT メッセージが GetMessage または PeekMessage から返されるか、UpdateWindow によってウィンドウに送信された後、システムは、ウィンドウが無効になるまで、または RDW_INTERNALPAINT フラグが設定された RedrawWindow が再度呼び出されるまで、メッセージをさらにWM_PAINT送信しません。

一部の一般的なコントロールでは、既定 のWM_PAINT メッセージ処理によって wParam パラメーターがチェックされます。 wParam が NULL 以外の場合、コントロールは値が HDC であると見なし、そのデバイス コンテキストを使用して描画します。

必要条件

要件
サポートされている最小のクライアント
Windows 2000 Professional [デスクトップ アプリのみ]
サポートされている最小のサーバー
Windows 2000 Server [デスクトップ アプリのみ]
ヘッダー
Winuser.h (Windows.h を含む)

関連項目

描画と描画の概要

メッセージの描画と描画

BeginPaint

DefWindowProc

DispatchMessage

EndPaint

GetMessage

GetUpdateRect

PeekMessage

RedrawWindow

UpdateWindow

WM_ERASEBKGND

WM_NCPAINT

WM_PRINT

WM_PRINTCLIENT