개발자 '쑥말고인절미'

[C++] InvalidateRect()와 UpdateWindow() 본문

STUDY/C++ & MFC

[C++] InvalidateRect()와 UpdateWindow()

쑥말고인절미 2024. 10. 4. 23:54

간단 정리

  • Invalidate() 메소드는 무효화된 영역을 설정하여 화면을 생긴하는 WM_PAINT 메시지를 발생시키는 함수
  • UpdateWindow() 메소드는 갱신할 영역이 있으면 시스템의 상태와 상관없이 즉각 갱신하라고 명령하는 함수

 

InvalidateRect()와 UpdateWindow()를 같이 쓰는 이유

  • WM_PAINT는 우선순위가 가장 낮기 때문에 메시지가 발생했다 해도 즉각적으로 화면을 갱신해주지 않는다.
  • 일반적인 경우에는 InvalidateRect() 메소드만 사용해도 갱신이 정상적으로 잘 되지만, 화면을 즉각적으로 갱신하거나 CPU에 부담을 주는 작업이 진행되면서 InvalidateRect() 메소드를 사용하면 생각보다 갱신이 느려질 수 있다.
  • 그래서 시스템의 상태에 상관없이 즉각적으로 갱신이 필요하다면 UpdateWindow() 메소드를 사용해서 화면을 갱신하면된다.
  • 만약, UpdateWindow() 메소드가 호출됐는데 클라이언트 영역에 WM_PAINT 메시지가 없다면 작업을 진행하지 않는다.
  • 즉, 스스로 WM_PAINT 메시지가 발생하는 조건을 구성하지 않기 때문에 아래와 같이 InvalidateRect 함수와 함께 사용하는 것이 일반적이다.
// 클라이언트 영역을 무효화 처리해서 WM_PAINT 메시지를 발생시킨다.
InvalidateRect(hWnd, NULL, TRUE);

// WM_PAINT 메시지를 즉시 처리한다.
UpdateWindow(hWnd);

 

UpdateWindow()

  • MFC의 경우 CWnd 클래스의 UpdateWindow() 멤버 함수를 사용하면 내부적으로 Win32의 API 함수를 호출할 수 있다.
// Win32의 원형
BOOL UpdateWindow(HWND hWnd);

// MFC에서는 CWnd 클래스에 아래와 같은 형태로 있음
void UpdateWindow();
  • 함수 호출로 클라이언트 영역이 성공적으로 갱신되면 0이 아닌 값을 반환, 갱신에 실패하면 0을 반환.
  • 이 함수의 특징 상 굳이 반환 값을 체크할 필요는 없다함(그 특징이 뭔진 모름^^;)

 

참조링크

 

InvalidateRect 함수에 대하여

: Win32 프로그래밍 관련 전체 목차 - http://blog.naver.com/tipsware/221059977193 : Windows API와...

blog.naver.com