UpdateWindow

원형

BOOL UpdateWindow(HWND hWnd);

MFC 원형

void CWnd::UpdateWindow( );

인수

▶ hWnd : 윈도우 핸들

리턴

성공하면 0이 아닌 값을 리턴하며 에러 발생시 0을 리턴한다.

설명

이 함수는 윈도우 프로시저로 WM_PAINT 메시지를 보내 작업영역을 강제로 그리도록 한다. WM_PAINT 메시지는 우선 순위가 늦기 때문에 무효 영역이 있더라도 먼저 처리해야할 다른 메시지가 있으면 즉시 처리되지 않는다. 만약 다른 어떤 메시지보다도 WM_PAINT를 먼저 처리해야 할 필요가 있다면 이 함수를 호출하여 즉시 작업영역을 다시 그리도록 할 수 있다.

이 함수는 메시지 큐를 통하지 않고 윈도우 프로시저로 곧바로 WM_PAINT 메시지를 전달하므로 메시지 대기 순서에 상관없이 즉시 작업영역을 다시 그리도록 한다. 그러나 작업영역에 무효영역이 없으면 이 함수를 호출한다하더라도 WM_PAINT 메시지는 보내지지 않는다. 작업영역을 완전히 다시 즉시 그리려면 InvalidateRect 함수로 작업영역을 무효화한 후 이 함수를 호출하면 된다.

예제 1

다음 예제는 이 함수로 작업영역을 즉시 그리는 예를 보여준다.

LRESULT CALLBACK WndProc(HWND hWnd,UINT iMessage,WPARAM wParam,LPARAM lParam)
{
	HDC hdc;
	PAINTSTRUCT ps;
	static BOOL bEllipse;

	switch(iMessage) {
	case WM_LBUTTONDOWN:
		bEllipse=TRUE;
		InvalidateRect(hWnd,NULL,TRUE);
		UpdateWindow(hWnd);
		Sleep(500);
		// 시간이 걸리는 어떤 작업
		return TRUE;
	case WM_RBUTTONDOWN:
		bEllipse=FALSE;
		InvalidateRect(hWnd,NULL,TRUE);
		Sleep(500);
		// 시간이 걸리는 어떤 작업
		return TRUE;
	case WM_PAINT:
		hdc=BeginPaint(hWnd, &ps);
		if (bEllipse) {
			Ellipse(hdc,10,10,300,200);
		}
		EndPaint(hWnd, &ps);
		return 0;
	case WM_DESTROY:
		PostQuitMessage(0);
		return 0;
	}
	return(DefWindowProc(hWnd,iMessage,wParam,lParam));
}

WM_PAINT에서는 bEllipse변수값에 따라 타원을 그리거나 지운다. 왼쪽 버튼을 누르면 bEllipse를 TRUE로 바꾼 후 작업영역을 무효화하고 오른쪽 버튼을 누르면 bEllipse를 FALSE로 바꾼 후 작업영역을 무효화하므로 좌우 마우스 버튼을 눌러 타원을 그리거나 지울 수 있다. 그런데 만약 bEllipse값을 바꾼 후 시간이 걸리는 어떤 작업을 해야 한다고 해 보자. 이 경우 무효영역이 있더라도 WM_PAINT 메시지가 즉시 처리되지 않기 때문에 이 작업이 끝날 때까지는 bEllipse 변수의 값의 변화가 반영되지 않는다. 이럴 때 UpdateWindow 함수를 호출해 주면 즉시 WM_PAINT를 처리하여 작업영역을 다시 그린다.

예제에서는 WM_LBUTTONDOWN에만 UpdateWindow 함수를 호출했으므로 타원이 그려질 때는 즉시 그려지나 지워질 때는 0.5초의 지연 시간이 발생하게 된다. 이 예제에서 Sleep(500)은 시간이 걸리는 어떤 작업을 대체하기 위해 삽입되었다.

참고함수

RedrawWindow : UpdateWindow보다 다양한 플래그를 가지는 다시 그리기 함수이다.

플랫폼

95이상

참조

 


written by http://www.winapi.co.kr