Invalidate() VS UpdateWindow() 차이점

InvalidateRect()는 윈도우의 클라이언트 영역 중에서 일부분을 무효화 시키는 것입니다.
이때, 첫번째 인자는 어떤 윈도우인지를 가리키는 윈도우 핸들이고,
두번째 인자는 무효과시킬 사각 영역 좌표입니다. 이게 NULL이면 클라이언트 영역 전체라는 것이구요.
그리고 세번째 인자는 그 무효화 영역이 지워지고 다시 그려져야 하는지를 설정합니다. 만약 TRUE이면, 그 윈도우에게는 WM_ERASEBKGND 메시지가 한번 날려지고, WM_PAINT 메시지가 날라갑니다. 만약 FALSE이면 WM_PAINT 메시지만 날라갑니다.

위의 답변에 보시면 InvalidateRect()가 WM_PAINT 메시지를 발생시키지 않는다고 했는데요, WM_PAINT 메시지를 발생 시킵니다.

그리고 UpdateWindow()의 역할은 윈도우 프로시져로 WM_PAINT 메시지를 직접 보내 사용자 영역을 그리도록 한다. 이때 윈도우가 무효화 영역이 있어야 합니다. WM_PAINT 메시지는 우선순위가 낮기 때문에 새롭게 그려야 할 영역이 있더라도 먼저 처리해야 할 다른 메시지가 있으면 바로 처리되지 않는다.
즉, 다시 그려져야할 필요가 있는 영역이 있다면 다시 그리도록 만드는 것입니다.

정리하면, InvalidateRect()는 특정 영역을 무조건 다시 그리도록 만드는 함수이며, UpdateWindow()는 현재 윈도우에서 다시 그릴 필요가 있는 영역이 있는지 확인하고 있다면 다시 그리도록 하는 함수입니다.

Tip. InvalidateRect를 하면 WM_PAINT를 호출하는 것이 아니라 단지 화면을 무효화하는 것뿐이고 화면이 무효화되면 WM_PAINT 메시지가 메시지 큐에 들어가게 된다. 따라거 큐에 있는 WM_PAINT를 처리하기 전에 다시 화면이 무효화된다면 윈도우는 그 이전 무효 영역과 다시 발생한 무효 영역을 합쳐서 한번에 그려주게 된다. 만약 무효화하자마자 WM_PAINT를 실행시키고 싶다면

InvalidateRect 호출 후에 UpdateWindow를 호출해준다.

* UpdateWindow() 사용 예

InvalidateRect(hWnd, NULL, TRUE);

UpdateWindow(hWnd);

// 무효화 영역을 만들어 준 후 UpdateWindow()를 호출한다.

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 항목은 *(으)로 표시합니다