UpdateWindow(), InvalidateRect()
원형 |
BOOL UpdateWindow(HWND hWnd); |
MFC 원형 |
void CWnd::UpdateWindow( ); |
인수 |
▶ hWnd : 윈도우 핸들 |
리턴 |
성공하면 0이 아닌 값을 리턴하며 에러 발생시 0을 리턴한다. |
설명 |
이 함수는 윈도우 프로시저로 WM_PAINT 메시지를 보내 작업영역을 강제로 그리도록 한다. WM_PAINT 메시지는 우선 순위가 늦기 때문에 무효 영역이 있더라도 먼저 처리해야할 다른 메시지가 있으면 즉시 처리되지 않는다. 만약 다른 어떤 메시지보다도 WM_PAINT를 먼저 처리해야 할 필요가 있다면 이 함수를 호출하여 즉시 작업영역을 다시 그리도록 할 수 있다. 이 함수는 메시지 큐를 통하지 않고 윈도우 프로시저로 곧바로 WM_PAINT 메시지를 전달하므로 메시지 대기 순서에 상관없이 즉시 작업영역을 다시 그리도록 한다. 그러나 작업영역에 무효영역이 없으면 이 함수를 호출한다하더라도 WM_PAINT 메시지는 보내지지 않는다. 작업영역을 완전히 다시 즉시 그리려면 InvalidateRect 함수로 작업영역을 무효화한 후 이 함수를 호출하면 된다. 다음 예제는 이 함수로 작업영역을 즉시 그리는 예를 보여준다. 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 |
---|---|
[VC++] 편집기(MDI) (0) | 2007.03.10 |
자주 쓰이는 API함수 (0) | 2007.03.10 |