Понимание контекста устройства - PullRequest
7 голосов
/ 06 мая 2010

Как относительный новичок в MFC, я часто вижу контексты устройств (DC). Я смутно понимаю, что это связано с рисованием, но подробности не очень хорошо объяснены где-либо, что я могу найти. Что означает создание «совместимого контекста устройства» и почему это важно? Что делает SelectObject и как мне сначала сделать DC-совместимым?

1 Ответ

14 голосов
/ 06 мая 2010

Контекст устройства - это просто место, где происходит рисование, поэтому, если у вас два разных DC, вы рисуете в двух разных местах. Вроде как дескриптор файла.

Контексты устройств могут относиться к объектам на экране или к растровым изображениям, которые просто хранятся в памяти, и, возможно, в других местах, это только два, о которых я могу думать в данный момент.

Совместимые контексты - это те, которые имеют одинаковую организацию базовых пикселей, под которой подразумевается количество бит на пиксель, байтов на пиксель, организация цвета и т. Д. Контексты растрового устройства памяти могут иметь любую организацию, которую вы хотите, но ваши контексты экрана будут (в конечном итоге) связаны с буферами на вашей видеокарте, которые будут (в зависимости от режима и т. Д.) Иметь очень специфическую организацию пикселей.

Наличие совместимых контекстов означает эффективную передачу данных изображения между ними, поскольку перевод данных практически не требуется. С другой стороны, если у вас 256-цветная палитра, 8-битная карта и вы пытаетесь перетащить ее на экран с 8-битным RGBA на пиксель, каждый последний пиксель потребует значительного массирования, так как оно копируется и, следовательно, копирование несовместимо. растровые изображения намного медленнее. Согласно документации Win32 SDK, как минимум, BitBlt () и StretchBlt () «конвертируют исходный цветовой формат в соответствие с целевым форматом», так что это может быть сделано.

Исследуйте CreateCompatibleDC () и CreateCompatibleBitmap () в качестве отправных точек для того, как создавать контексты рисования, которые совместимы с уже существующими.

SelectObject () контролирует, какие ресурсы в данный момент активны в контексте устройства. Контекст имеет текущее перо, кисть, шрифт и растровое изображение. Это упрощает многие другие вызовы GDI, позволяя указывать меньшее количество параметров. Например, вам не нужно указывать шрифт, когда вы используете TextOut (), но если вы хотите изменить шрифт, вот где приходит SelectObject (). Если вы передаете SelectObject () дескриптор шрифта, возвращается значение является дескриптором действующего шрифта, а последующие операции используют новый шрифт. Поведение одинаково для других видов ресурсов, ручек, кистей и т. Д.

...