Skip to content
DarkKaiser의 블로그
DarkKaiser의 블로그
  • 개발 관련 자료(노션)
  • Raspberry Pi(노션)
  • WD My Cloud(노션)
  • GitHub
DarkKaiser의 블로그

Invalidate() VS UpdateWindow() 차이점

DarkKaiser, 2010년 5월 24일2023년 9월 4일

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()를 호출한다.

C/C++/VC++ InvalidateRectUpdateWindow

글 내비게이션

Previous post
Next post

답글 남기기 응답 취소

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다

최신 글

  • AssertJ 소개testCompile ‘org.assertj:assertj-core:3.6.2’ 2017년 9월 14일
  • 자주 사용되는 Lombok 어노테이션 2017년 9월 14일
  • 유니코드 #3 2017년 9월 14일
  • 유니코드 #2 2017년 9월 14일
  • 유니코드 #1 2017년 9월 14일

최신 댓글

    카테고리

    • 개인 자료 (1)
      • 일기 (1)
    • 주절주절 (7)
    • 프로그래밍 갤러리 (16)
    • 프로그래밍 언어 (186)
      • Java (29)
      • C/C++/VC++ (114)
      • C# (11)
      • Visual Basic (6)
      • 안드로이드 (9)
      • Objective-C (5)
      • JavaScript (4)
      • JSP/Servlet (2)
      • Python (4)
      • 어셈블러 (1)
    • 개발++ (44)
      • Book (11)
        • Joel On Software (10)
      • 프로젝트 관리 (6)
      • Maven (1)
      • 디버깅 (1)
      • DirectX (1)
      • Silverlight (1)
      • RESTful (1)
      • Hacking (1)
      • WDM (4)
      • VoIP (5)
      • 기타 (1)
    • 개발 도구 (15)
      • eclipse (14)
      • Sublime Text (1)
    • 네트워크 (7)
    • 설치 및 배포 (7)
      • InstallShield (2)
      • NSIS (4)
    • 버전 관리 (9)
      • Git (2)
      • CVS (2)
      • Subversion (5)
    • 데이터베이스 (7)
      • Oracle (3)
      • Sybase (2)
      • MS-SQL (2)
    • 단위테스트 (3)
      • JUnit (1)
      • NUnit (2)
    • 버그추적시스템 (2)
      • mantis (2)
    • 운영체제 (7)
      • Windows (5)
      • 리눅스 (2)
    • WAS (3)
      • WebLogic (3)
    • 디자인패턴 (1)
    • 디지털 이미지 프로세싱 (16)

    태그

    Abstract ActiveX AfxParseURL Automation boost devenv.exe event EventLogTraceListener Hover interface IO iTextSharp JAD jar JavaScript Joel Leave MFC Monitor msdev.com MSDN mutable PDF Properties RAW Saturation SHGetFolderPath SHGetKnownFolderPath SQLite STLTask String TextWriterTraceListener URL VI 권한 데이터소스 디컴파일러 문자열 스레드 동기화 스레드 생성 실용주의 프로그래머 자동화 테스팅 파일포맷 프리컴파일

    메타

    • 로그인
    • 엔트리 피드
    • 댓글 피드
    • WordPress.org
    ©2025 DarkKaiser의 블로그 | WordPress Theme by SuperbThemes