Контексты частного устройства отображения
Контекст частного устройства позволяет приложению избежать получения и инициализации контекста отображаемого устройства каждый раз, когда приложение должно рисовать в окне. Контексты частных устройств полезны для окон, которым требуется много изменений значений атрибутов контекста устройства для подготовки к рисованию. Контексты частных устройств сокращают время, необходимое для подготовки контекста устройства, и, следовательно, время, необходимое для выполнения рисования в окне.
Приложение направляет систему на создание контекста частного устройства для окна, указывая стиль CS_OWNDC в классе окна. Система создает уникальный контекст частного устройства каждый раз, когда создает новое окно, принадлежащее классу . Изначально контекст частного устройства имеет те же значения по умолчанию для атрибутов, что и общий контекст устройства, но приложение может изменить их в любое время. Система сохраняет изменения в контексте устройства в течение жизненного цикла окна или до тех пор, пока приложение не внося дополнительные изменения.
Приложение может получить дескриптор в контексте частного устройства с помощью функции GetDC в любой момент после создания окна. Приложение должно получить дескриптор только один раз. После этого он может хранить и использовать дескриптор любое количество раз. Так как контекст частного устройства не является частью кэша контекста отображаемого устройства, приложению никогда не нужно освобождать контекст устройства с помощью функции ReleaseDC .
Система автоматически настраивает контекст устройства, чтобы отразить изменения в окне, такие как перемещение или изменение размера. Это гарантирует, что все перекрывающиеся окна всегда будут правильно обрезаны; то есть приложение не требует никаких действий для обеспечения обрезки. Однако система не изменяет контекст устройства, чтобы включить регион обновления. Поэтому при обработке сообщения WM_PAINT приложение должно включить регион обновления, вызвав BeginPaint или получив регион обновления и пересекая его с текущей областью обрезки. Если приложение не вызывает BeginPaint, оно должно явно проверить регион обновления с помощью функции ValidateRect или ValidateRgn . Если приложение не проверяет область обновления, окно получает бесконечный ряд сообщений WM_PAINT .
Так как BeginPaint скрывает курсор, если оно отображается в окне, приложение, которое вызывает BeginPaint , должно также вызвать функцию EndPaint для восстановления курсора. EndPaint не оказывает другого влияния на контекст частного устройства.
Хотя контекст частного устройства удобен в использовании, он требует много памяти с точки зрения системных ресурсов, требуя 800 или более байтов для хранения. Контексты частных устройств рекомендуется использовать, когда вопросы производительности перевешивают затраты на хранение.
Система включает контекст частного устройства при отправке WM_ERASEBKGND сообщения в приложение. Текущий выбор контекста частного устройства, включая режим сопоставления, действует, когда приложение или система обрабатывает эти сообщения. Чтобы избежать нежелательных последствий, система использует логические координаты при стирания фона; например, она использует функцию GetClipBox для получения логических координат области для удаления и передает эти координаты в функцию FillRect . Приложения, обрабатывающие эти сообщения, могут использовать аналогичные методы.
Приложение может использовать функцию GetDCEx , чтобы система возвращала общий контекст устройства для окна с частным контекстом устройства. Это полезно для быстрого перехода к окну без изменения текущих значений атрибутов контекста частного устройства.