프라이빗 디스플레이 디바이스 컨텍스트
프라이빗 디바이스 컨텍스트를 사용하면 애플리케이션이 창에 그려야 할 때마다 디스플레이 디바이스 컨텍스트를 검색하고 초기화하지 않도록 할 수 있습니다. 프라이빗 디바이스 컨텍스트는 그리기를 준비하기 위해 디바이스 컨텍스트의 특성 값을 많이 변경해야 하는 창에 유용합니다. 프라이빗 디바이스 컨텍스트는 디바이스 컨텍스트를 준비하는 데 필요한 시간을 줄이므로 창에서 그리기를 수행하는 데 필요한 시간을 줄입니다.
애플리케이션은 창 클래스에서 CS_OWNDC 스타일을 지정하여 시스템에 창에 대한 프라이빗 디바이스 컨텍스트를 만들도록 지시합니다. 시스템은 클래스에 속하는 새 창을 만들 때마다 고유한 프라이빗 디바이스 컨텍스트를 만듭니다. 처음에는 프라이빗 디바이스 컨텍스트에 공통 디바이스 컨텍스트와 특성에 대한 기본값이 동일하지만 애플리케이션은 언제든지 이를 수정할 수 있습니다. 시스템은 창의 수명 동안 또는 애플리케이션이 추가 변경을 할 때까지 디바이스 컨텍스트에 대한 변경 내용을 유지합니다.
애플리케이션은 창을 만든 후 언제든지 GetDC 함수를 사용하여 프라이빗 디바이스 컨텍스트에 대한 핸들을 검색할 수 있습니다. 애플리케이션은 핸들을 한 번만 검색해야 합니다. 그 후에는 핸들을 여러 번 유지하고 사용할 수 있습니다. 프라이빗 디바이스 컨텍스트는 디스플레이 디바이스 컨텍스트 캐시의 일부가 아니므로 애플리케이션은 ReleaseDC 함수를 사용하여 디바이스 컨텍스트를 해제할 필요가 없습니다.
시스템은 이동 또는 크기 조정과 같은 창의 변경 내용을 반영하도록 디바이스 컨텍스트를 자동으로 조정합니다. 이렇게 하면 겹치는 창이 항상 제대로 잘립니다. 즉, 클리핑을 보장하기 위해 애플리케이션에서 아무 작업도 필요하지 않습니다. 그러나 시스템은 업데이트 영역을 포함하도록 디바이스 컨텍스트를 수정하지 않습니다. 따라서 WM_PAINT 메시지를 처리할 때 애플리케이션은 BeginPaint 를 호출하거나 업데이트 영역을 검색하여 현재 클리핑 지역과 교차하여 업데이트 영역을 통합해야 합니다. 애플리케이션이 BeginPaint를 호출하지 않는 경우 ValidateRect 또는 ValidateRgn 함수를 사용하여 업데이트 지역의 유효성 을 명시적으로 검사해야 합니다. 애플리케이션이 업데이트 영역의 유효성을 검사하지 않으면 창에서 끝없이 일련의 WM_PAINT 메시지를 받습니다.
BeginPaint는 창이 표시되면 케어를 숨기므로 BeginPaint를 호출하는 애플리케이션도 EndPaint 함수를 호출하여 케어를 복원해야 합니다. EndPaint 는 프라이빗 디바이스 컨텍스트에 다른 영향을 주지 않습니다.
프라이빗 디바이스 컨텍스트를 사용하는 것이 편리하지만 시스템 리소스 측면에서 메모리를 많이 사용하므로 800바이트 이상을 저장해야 합니다. 성능 고려 사항이 스토리지 비용보다 큰 경우 개인 디바이스 컨텍스트를 사용하는 것이 좋습니다.
시스템에는 애플리케이션에 WM_ERASEBKGND 메시지를 보낼 때 프라이빗 디바이스 컨텍스트가 포함됩니다. 매핑 모드를 포함한 프라이빗 디바이스 컨텍스트의 현재 선택은 애플리케이션 또는 시스템이 이러한 메시지를 처리할 때 적용됩니다. 바람직하지 않은 효과를 방지하기 위해 시스템은 배경을 지워도 논리 좌표를 사용합니다. 예를 들어 GetClipBox 함수를 사용하여 영역의 논리적 좌표를 검색하여 지우고 이러한 좌표를 FillRect 함수에 전달합니다. 이러한 메시지를 처리하는 애플리케이션은 유사한 기술을 사용할 수 있습니다.
애플리케이션은 GetDCEx 함수를 사용하여 시스템에서 프라이빗 디바이스 컨텍스트가 있는 창에 대한 공통 디바이스 컨텍스트를 반환하도록 강제할 수 있습니다. 이는 개인 디바이스 컨텍스트의 특성의 현재 값을 변경하지 않고 창에 대한 빠른 터치업을 수행하는 데 유용합니다.