Понимание контекстов устройства

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

7
задан Smashery 6 May 2010 в 01:08
поделиться

1 ответ

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

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

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

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

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

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

14
ответ дан 6 December 2019 в 15:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: