원형

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이상


=============================================================================

InvalidateRect() 

BOOL InvalidateRect(HWND hWnd(WndProc 1번째인자), CONST RECT *lpRect, BOOL bErase);
내부에서 윈도우의 모습을 변경시켰을때는 변경된 부분이 다시 그려질 수 있도록 강제로 무효화시켜
주어야 하고 이때 사용되는 함수가 InvalidateRect로 재출력해달라~
윈도우의 작업 영역을 무효화시켜 윈도우즈로 하여금 WM_PAINT 메시지를 해당 윈도우로 보내도록 한다.
▶hWnd:무효화의 대상이되는 윈도우.즉 다시 그려져야 할 윈도우의 핸들.NULL일 경우 모든 윈도우를 무효화한다.
▶lpRect:무효화할 영역. NULL이면 작업 영역 전체가 무효화된다.
▶bErase:무효 영역의 배경을 먼저 지울 것인가를 지정한다. TRUE이면 BeginPaint
함수가 배경을 먼저 지운 후 작업 영역을 그린다.
TRUE : 배경색부터 다시 출력, FALSE : 배경색은 그대로 나둔다음 나머지 부분을 출력합니다.


===>결론 : UpdateWindow() 는 즉시 그려주는데, InvalidateRect()메시지 앞에 받은거 다 처리하고

그래주겠네..

'WindowsPrograming' 카테고리의 다른 글

API/MFC차이점  (0) 2007.03.11
UpdateWindow(), InvalidateRect()  (0) 2007.03.10
[VC++] 편집기(MDI)  (0) 2007.03.10
자주 쓰이는 API함수  (0) 2007.03.10
Posted by Real_G