클라이언트 영역 무효화
시스템은 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 메시지를 창 프로시저로 직접 보냅니다.