개발자 '쑥말고인절미'
[C++] InvalidateRect()와 UpdateWindow() 본문
간단 정리
- 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
'STUDY > C++ & MFC' 카테고리의 다른 글
[MFC] SetWindowPos(), MoveWindow() (0) | 2024.08.27 |
---|---|
[MFC]GetWindowRect(), GetClientRect(), ScreenToClient() (0) | 2024.08.27 |
[C++] nullptr (0) | 2024.08.12 |
[MFC] CMainFrame* pMain = (CMainFrame*)AfxGetMainWnd(); (0) | 2024.08.11 |
[C++] 헤더파일 import 하지않고 포인터 사용해서 클래스 간 메소드 참조하기 (0) | 2024.08.07 |