Понимание контекста устройства
Как относительный новичок в MFC, я часто вижу контексты устройств (DC). Я смутно понимаю, что это связано с рисованием, но подробности не очень хорошо объяснены где-либо, что я могу найти. Что означает создание "совместимого контекста устройства" и почему это важно? Что делает SelectObject и как мне сначала сделать DC-совместимым?
2 ответа
Контекст устройства - это просто место, где происходит рисование, поэтому, если у вас два разных DC, вы рисуете в двух разных местах. Вроде как дескриптор файла.
Контексты устройств могут относиться к объектам на экране или к растровым изображениям, которые просто хранятся в памяти, и, возможно, в других местах, это только два, о которых я могу думать в данный момент.
Совместимые контексты - это те, которые имеют одинаковую организацию пикселей, под которой подразумевается количество бит на пиксель, байтов на пиксель, организация цвета и так далее. Контексты растрового устройства памяти могут иметь любую организацию, которую вы хотите, но контексты вашего экрана будут (в конечном итоге) связаны с буферами на вашей видеокарте, которые будут (в зависимости от режима и т. Д.) Иметь очень специфическую организацию пикселей.
Наличие совместимых контекстов означает эффективную передачу данных изображения между ними, потому что перевод данных практически не требуется. С другой стороны, если у вас 256-цветная палитра, 8-битная карта и вы пытаетесь перетащить ее на экран с 8-битным RGBA на пиксель, каждый последний пиксель потребует значительного массирования, поскольку он копируется и, следовательно, копирование несовместимо. растровые изображения намного медленнее. Согласно документации Win32 SDK, как минимум BitBlt() и StretchBlt() "конвертируют исходный цветовой формат в соответствие с целевым форматом", так что это можно сделать.
Изучите CreateCompatibleDC() и CreateCompatibleBitmap() в качестве отправных точек для того, как создавать контексты рисования, которые совместимы с уже существующими.
SelectObject() контролирует, какие ресурсы в данный момент активны в контексте устройства. Контекст имеет текущее перо, кисть, шрифт и растровое изображение. Это упрощает многие другие вызовы GDI, позволяя указывать меньшее количество параметров. Например, вам не нужно указывать шрифт, когда вы используете TextOut(), но если вы хотите изменить шрифт, вот где приходит SelectObject(). Если вы передаете SelectObject() дескриптор шрифта, возвращается Значение - это дескриптор действующего шрифта, а последующие операции используют новый шрифт. Поведение одинаково для других видов ресурсов, ручек, кистей и т. Д.
(Старый вопрос, но это отображается при поиске в Google...)
Боюсь, что для новичков выбранный ответ может немного ввести в заблуждение.
Пожалуйста, имейте в виду, что MFC является оболочкой Win32 API, поэтому нам нужно посмотреть на уровень Win32, чтобы лучше понять, что происходит.
Чтобы понять, почему существует контекст устройства, мы должны понимать GDI(интерфейс графического устройства).
Тогда почему существует GDI? - Для независимости устройства. Для этого Microsoft создала графические объекты (кисть, перо и т. д.), каждый из которых оборачивает и абстрагирует все проблемы зависимости устройства.
Теперь нам не нужно заботиться о разных устройствах, и в этом весь смысл GDI .
Итак, нам нужно хранить графические объекты (кисть, перо, растровое изображение,...) в некоторой структуре данных, и это контекст устройства .
Тогда что такое функция SelectObject ?
Буквально это позволяет DC «выбрать» графический объект. То есть мы используем SelectObject для изменения дескриптора графического объекта, хранящегося в DC, на другой дескриптор графического объекта, который мы хотим использовать.
Тогда что такое совместимый контекст устройства ?
совместимый контекст устройства (= контекст устройства памяти) использует память, а не устройства.
Из MSDN (выделено мной):
Чтобы приложения могли размещать выходные данные в памяти, а не отправлять их на реальное устройство, используйте специальный контекст устройства для операций с растровыми изображениями, который называется контекстом устройства памяти . Контроллер памяти позволяет системе рассматривать часть памяти как виртуальное устройство. Это массив битов в памяти, который приложение может временно использовать для хранения цветовых данных для растровых изображений, созданных на обычной поверхности рисования. Поскольку растровое изображение совместимо с устройством, контроллер домена памяти также иногда называют контекстом совместимого устройства .
DC памяти хранит растровые изображения для конкретного устройства. Приложение может создать контроллер домена памяти, вызвав функцию CreateCompatibleDC.
Совместимый DC можно использовать, например, для уменьшения мерцания, потому что мы можем сохранить растровое изображение в памяти и показать его один раз, а не показывать каждый раз при изменении изображения.
Следование документам MSDN будет полезно для новичков (включая меня).
Контексты устройств с точки зрения MFC.
Контексты устройств с точки зрения Win32 и следующий раздел .