Share via


WM_PAINT 메시지

일반적으로 애플리케이션은 WM_PAINT 메시지에 대한 응답으로 창에 그립니다. 창의 변경 내용이 클라이언트 영역의 콘텐츠를 변경한 경우 시스템은 이 메시지를 창 프로시저로 보냅니다. 시스템은 애플리케이션 메시지 큐에 다른 메시지가 없는 경우에만 메시지를 보냅니다.

WM_PAINT 메시지를 받으면 애플리케이션은 BeginPaint를 호출하여 클라이언트 영역에 대한 디스플레이 디바이스 컨텍스트를 검색하고 GDI 함수 호출에 사용하여 클라이언트 영역을 업데이트하는 데 필요한 그리기 작업을 수행할 수 있습니다. 그리기 작업을 완료한 후 애플리케이션은 EndPaint 함수를 호출하여 디스플레이 디바이스 컨텍스트를 해제합니다.

BeginPaint가 디스플레이 디바이스 컨텍스트를 반환하기 전에 시스템은 지정된 창에 대한 디바이스 컨텍스트를 준비합니다. 먼저 디바이스 컨텍스트의 클리핑 영역을 업데이트해야 하는 창 부분과 사용자에게 표시되는 부분의 교차점과 같도록 설정합니다. 변경된 창의 해당 부분만 다시 그려집니다. 이 지역 외부로 그리려는 시도가 잘리고 화면에 표시되지 않습니다.

또한 시스템은 BeginPaint가 반환되기 전에 프로시저에 WM_NCPAINT 및 WM_ERASEBKGND 메시지를 보낼 수 있습니다. 이러한 메시지는 애플리케이션이 비클라이언트 영역 및 창 배경을 그리도록 지시합니다. 비클라이언트 영역은 클라이언트 영역 외부에 있는 창의 일부입니다. 영역에는 제목 표시줄, 창 메뉴( 시스템 메뉴라고도 함) 및 스크롤 막대와 같은 기능이 포함됩니다. 대부분의 애플리케이션은 기본 창 함수 인 DefWindowProc를 사용하여 이 영역을 그리므로 WM_NCPAINT 메시지를 이 함수에 전달합니다. 창 배경은 다른 그리기 작업을 시작하기 전에 창이 채워진 색 또는 패턴입니다. 배경은 창이나 창 아래 화면의 모든 이미지를 포함합니다. 창이 클래스 배경 브러시가 있는 창 클래스에 속하는 경우 DefWindowProc 함수는 창 배경을 자동으로 그립니다.

BeginPaint 는 업데이트할 창 부분의 차원과 창 배경이 그려졌는지 여부를 나타내는 플래그와 같은 정보로 PAINTSTRUCT 구조를 채웁니다. 애플리케이션은 이 정보를 사용하여 그리기를 최적화할 수 있습니다. 예를 들어 rcPaint 멤버가 지정한 업데이트 영역의 차원을 사용하여 그리기를 업데이트해야 하는 창의 해당 부분으로만 제한할 수 있습니다. 애플리케이션에 매우 간단한 출력이 있는 경우 업데이트 영역을 무시하고 전체 창에 그릴 수 있으며 시스템에 의존하여 불필요한 출력을 삭제(클립)할 수 있습니다. 시스템은 클리핑 영역 외부로 확장되는 그리기를 클립하기 때문에 업데이트 영역에 있는 그리기만 표시됩니다.

BeginPaint 는 창의 업데이트 영역을 NULL로 설정합니다. 이렇게 하면 지역이 지워지게 되므로 후속 WM_PAINT 메시지가 생성되지 않습니다. 애플리케이션이 WM_PAINT 메시지를 처리하지만 BeginPaint 를 호출하지 않거나 업데이트 지역을 지우지 않으면 지역이 비어 있지 않은 한 애플리케이션은 WM_PAINT 메시지를 계속 받습니다. 모든 경우에 애플리케이션은 WM_PAINT 메시지에서 반환하기 전에 업데이트 영역을 지워야 합니다.

애플리케이션이 그리기를 완료하면 EndPaint를 호출해야 합니다. 대부분의 창에서 EndPaint 는 디스플레이 디바이스 컨텍스트를 해제하여 다른 창에서 사용할 수 있도록 합니다. EndPaint 는 이전에 BeginPaint에 의해 숨겨진 경우 캐리트도 표시합니다. BeginPaint 는 그리기 작업이 손상되지 않도록 캐리트를 숨깁니다.