WM_PAINT 메시지
일반적으로 애플리케이션은 WM_PAINT 메시지에 대한 응답으로 창에 화면을 그립니다. 창이 변경되어 클라이언트 영역의 콘텐츠가 변경되면 시스템에서 이 메시지를 창 프로시저로 보냅니다. 애플리케이션 메시지 큐에 다른 메시지가 없는 경우에만 시스템에서 메시지를 보냅니다.
WM_PAINT 메시지를 받으면 애플리케이션은 BeginPaint 호출하여 클라이언트 영역에 대한 표시 디바이스 컨텍스트를 검색하고 GDI 함수 호출에 사용하여 클라이언트 영역을 업데이트하는 데 필요한 그리기 작업을 수행할 수 있습니다. 그리기 작업을 완료한 후 애플리케이션은 EndPaint 함수를 호출하여 디스플레이 디바이스 컨텍스트를 해제합니다.
BeginPaint표시 디바이스 컨텍스트를 반환하기 전에 시스템은 지정된 창에 대한 디바이스 컨텍스트를 준비합니다. 먼저 디바이스 컨텍스트의 클리핑 영역을 업데이트해야 하는 창 부분과 사용자에게 표시되는 부분의 교집합과 같도록 설정합니다. 변경된 창의 해당 부분만 다시 그려집니다. 이 지역 외부로 그리려는 시도가 잘리고 화면에 표시되지 않습니다.
또한 시스템이 WM_NCPAINT 및 WM_ERASEBKGND 메시지를 BeginPaint이 반환되기 전에 창 프로시저로 보낼 수 있습니다. 이러한 메시지는 애플리케이션이 비클라이언트 영역 및 창 배경을 그리도록 지시합니다. 비클라이언트 영역 클라이언트 영역 외부에 있는 창의 일부입니다. 영역에는 제목 표시줄, 창 메뉴(시스템 메뉴라고도 함) 및 스크롤 막대와 같은 기능이 포함됩니다. 대부분의 애플리케이션은 DefWindowProc기본 창 함수를 사용하여 이 영역을 그리므로 이 함수에 WM_NCPAINT 메시지를 전달합니다. 창 배경 다른 그리기 작업을 시작하기 전에 창이 채워지는 색 또는 패턴입니다. 배경은 창이나 창 아래 화면의 모든 이미지를 포함합니다. 창이 클래스 배경 브러시가 있는 창 클래스에 속하는 경우 DefWindowProc 함수는 창 배경을 자동으로 그립니다.
BeginPaint 업데이트할 창 부분의 크기와 창 배경이 그려졌는지 여부를 나타내는 플래그와 같은 정보로 PAINTSTRUCT 구조체를 채웁니다. 애플리케이션은 이 정보를 사용하여 그리기를 최적화할 수 있습니다. 예를 들어 rcPaint 멤버로 지정된 업데이트 영역의 차원을 사용하여 그리기를 업데이트해야 하는 창의 해당 부분으로만 제한할 수 있습니다. 애플리케이션에 매우 간단한 출력이 있는 경우 업데이트 영역을 무시하고 전체 창에 그릴 수 있으며 시스템에 의존하여 불필요한 출력을 삭제(클립)할 수 있습니다. 시스템은 클리핑 영역 외부로 확장되는 그리기를 클리핑하므로 업데이트 영역에 있는 그리기만 표시됩니다.
BeginPaint 창의 업데이트 영역을 NULL로 설정합니다. 이렇게 하면 지역이 지워지게 되므로 후속 WM_PAINT 메시지가 생성되지 않습니다. 애플리케이션이 WM_PAINT 메시지를 처리하지만 beginPaint 호출하지 않거나 업데이트 영역을 지우지 않으면 해당 지역이 비어 있지 않은 한 애플리케이션은 WM_PAINT 메시지를 계속 받습니다. 모든 경우에 애플리케이션은 WM_PAINT 메시지에서 반환하기 전에 업데이트 영역을 지워야 합니다.
애플리케이션이 그리기를 완료한 후 EndPaint호출해야 합니다. 대부분의 창에서 EndPaint 디스플레이 디바이스 컨텍스트를 해제하여 다른 창에서 사용할 수 있도록 합니다. EndPaint 은 이전에 BeginPaint에 의해 숨겨졌던 캐럿도 표시합니다. BeginPaint 그리기 작업이 손상되지 않도록 캐리트를 숨깁니다.
- 업데이트 지역
- 업데이트 지역 무효화 및 유효성 검사
- 업데이트 지역 검색
- 업데이트 지역을 제외
- 동기 및 비동기 그리기