クライアント領域の無効化
システムは、 WM_PAINT メッセージの唯一のソースではありません。 InvalidateRect または InvalidateRgn 関数は、ウィンドウのメッセージWM_PAINT間接的に生成できます。 これらの関数は、クライアント領域のすべてまたは一部を無効としてマークします (再描画する必要があります)。
次の例では、メッセージの処理時にウィンドウ プロシージャによってクライアント領域全体 WM_CHAR 無効になります。 これにより、ユーザーは数値を入力して図形を変更し、結果を表示できます。これらの結果は、アプリケーションのメッセージ キューに他のメッセージがないとすぐに描画されます。
RECT rc;
POINT aptPentagon[6] = {50,2, 98,35, 79,90, 21,90, 2,35, 50,2},
aptHexagon[7] = {50,2, 93,25, 93,75, 50,98, 7,75, 7,25, 50,2};
POINT *ppt = aptPentagon;
int cpt = 6;
.
.
.
case WM_CHAR:
switch (wParam)
{
case '5':
ppt = aptPentagon;
cpt = 6;
break;
case '6':
ppt = aptHexagon;
cpt = 7;
break;
}
InvalidateRect(hwnd, NULL, TRUE);
return 0L;
case WM_PAINT:
hdc = BeginPaint(hwnd, &ps);
GetClientRect(hwnd, &rc);
SetMapMode(hdc, MM_ANISOTROPIC);
SetWindowExtEx(hdc, 100, 100, NULL);
SetViewportExtEx(hdc, rc.right, rc.bottom, NULL);
Polyline(hdc, ppt, cpt);
EndPaint(hwnd, &ps);
return 0L;
この例では、InvalidateRect で使用される NULL 引数は、クライアント領域全体を指定します。TRUE 引数を指定すると、背景が消去されます。 アプリケーションのメッセージ キューに他のメッセージが含まれないまでアプリケーションを待機させたくない場合は、 UpdateWindow 関数を使用して 、WM_PAINT メッセージを直ちに強制的に送信します。 クライアント領域に無効な部分がある場合、 UpdateWindow は、指定したウィンドウの WM_PAINT メッセージをウィンドウ プロシージャに直接送信します。