2010-05-06 5 views
7

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

ответ

11

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

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

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

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

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

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

+0

Спасибо! Некоторые последующие вопросы по этому поводу: «Можете ли вы использовать несовместимые контроллеры домена и все еще иметь рабочую программу (хотя и намного медленнее)? И где SelectObject входит в концепцию совместимости контекста устройства? – Smashery

+0

@Smashery: отредактировано немного, чтобы лучше решить эти проблемы. – JustJeff

+0

Спасибо - очень ясный и полезный ответ! – Smashery

Смежные вопросы