Какие функции можно использовать для получения контекста устройства
Перейти к содержимому

Какие функции можно использовать для получения контекста устройства

  • автор:

Какие функции можно использовать для получения контекста устройства

Чтобы дать возможность прикладным программам помещать вывод данных в память, а не отправлять их на реальное устройство (диск), используется специальный контекст устройства для операций с точечным рисунком, называемый контекст устройства в памяти (memory device context) . Контекст устройства (DC) в памяти дает возможность системе рассматривать часть памяти как виртуальное устройство. Это — массив битов в памяти, который приложение временно может использовать, чтобы сохранить данные о цвете для точечных рисунков, созданных на обычной поверхности для рисования . Поскольку точечный рисунок совместим с устройством, контекст устройства (DC) в памяти также иногда относится к совместимому контексту устройства (compatible device context) .

Контекст устройства (DC) в памяти сохраняет образы точечных рисунков для конкретного устройства. Приложение может создать контекст устройства в памяти при помощи вызова функции CreateCompatibleDC.

Исходный точечный рисунок в контексте устройства (DC) в памяти — просто символ — заместитель. Его размеры — цепь один пиксель за другим пикселем. Прежде, чем приложение может начать рисовать, оно должно выбрать точечный рисунок с соответствующей шириной и высотой в DC при помощи вызова функции SelectObject. Чтобы создать точечный рисунок соответствующих размеров, используйте функцию CreateBitmap, CreateBitmapIndirect или CreateCompatibleBitmap. После того, как точечный рисунок выбран в контексте устройства (DC) в памяти, система заменяет одноразрядный массив на массив, достаточно большой, чтобы сохранить информацию о цвете для заданного прямоугольника пикселей.

Когда приложение передает дескриптор, возвращенный CreateCompatibleDC одной из функций рисования, требуемый вывод данных не появляется на поверхности рисования устройства. Вместо этого, система сохраняет информацию о цвете для получающейся в результате линии, кривой, текста или региона (области) в массиве битов. Приложение может копировать образ, сохраненный в памяти обратно на поверхность рисования при помощи вызова функции BitBlt, идентифицируя контекст устройства (DC) в памяти, как исходный контекст устройства, а окно или контекст устройства (DC) экрана, как целевой контекст устройства.

При отображении на экране аппратно-независимого (DIB) или аппратно-зависимого точечного рисунка (DDB), созданного из DIB палитрой устройства , Вы можете улучшить быстродействие, в котором образ рисуется, выстраивая логическую палитру, которая соответствует макету системной палитры. Чтобы сделать это, вызовите функцию GetDeviceCaps со значением NUMRESERVED , чтобы получить число зарезервированных цветов в системе. Затем вызовите функцию GetSystemPaletteEntries и заполните первые и последние NUMRESERVED /2 записи логической палитры соответствующими цветами системы. Например, если NUMRESERVED — 20, Вы должны заполнить первые и последние 10 записей логической палитры системными цветами. Затем заполнить оставшиеся 256- NUMRESERVED цвета логической палитры (в нашем примере, оставшиеся 236 цветов) цветами из DIB и установить флажок PC_NOCOLLAPSE на каждом из этих цветов.

Для получения дополнительной информации о цвете и палитрах, см. главу Цвета. Для получения дополнительной информации о точечных рисунках и операциях с точечным рисунком, см. главу Точечные рисунки.

Получение хендла контекста устройства

Как было отмечено выше, существует два метода получения контекста устройства — создание и получение контекста устройства. Разница связана с тем, что создание и, позже, уничтожение контекста устройства занимает некоторое время. Если вы собираетесь осуществлять вывод на принтер, то эти затраты времени ничтожно малы, по сравнению со всем временем печати. Однако, если вы собираетесь только осуществлять рисование в окне (которое может обновляться очень часто), то даже сравнительно быстрая операция создания контекста, повторенная многократно, займет значительное время. Поэтому в Windows существует несколько заранее созданных контекстов, соответствующих дисплею. При выводе в окно контекст создавать не надо, надо воспользоваться одной из функций, возвращающих такой заранее заготовленный контекст устройства.

Более того, в Windows методы, создающие контекст, предназначены для работы с устройством целиком, а методы, возвращающие уже существующий — с окном. Разница заключается в применении системы координат, связанной с контекстом. В первом случае система координат связана с верхним левым углом устройства, а во втором случае — с верхним левым углом внутренней (либо внешней) области окна.

Внимание! получаемые контексты должны быть обязательно использованы и освобождены в процессе обработки одного сообщения, в то время как создаваемые контексты устройства могут существовать продолжительное время.

Существует 7 основных методов получения и освобождения контекста устройства; причем каждый метод создает специфичный контекст устройства, предназначенный для выполнения определенных действий. Надо хорошо представлять, в каком случае каким методом надо пользоваться. Функции BeginPaint, GetDC, GetWindowDC возвращают заранее заготовленный контекст устройства, а функции CreateDC, CreateIC, CreateCompatibleDC и CreateMetaFile создают новый контекст.

1) При обработке сообщения WM_PAINT рекомендуется применять следующий способ:

BeginPaint (hWnd, &ps);

EndPaint (hWnd, &ps);

Структура PAINTSTRUCT содержит следующие данные:

typedef struct tagPAINTSTRUCT <

HDC hdc; // хендл контекста, он же возвращается функцией BeginPaint

BOOL fErase; // TRUE, если фон неверного прямоугольника надо очищать

RECT rcPaint; // неверный прямоугольник, может быть пустым!

// остальные поля используются Windows:

BYTE rgbReserved[ 16 ];

Полученный контекст устройства будет соответствовать только неверной области. Система координат остается связана с внутренней областью окна, а неверная область только ограничивает ту зону, в которой осуществляется реальное рисование; рисование вне этой области просто не приводит ни к какому эффекту.

Начиная с Windows 3.x для задания областей, нуждающихся в перерисовке используются не неверные прямоугольники, а неверные области (region), которые могут быть сложной формы. В этом случае прямоугольник rcPaint может быть указан пустым, в то время как неверная область реально существует.

Кроме этого, функция BeginPaint выполняет еще несколько операций:

если fErase равен TRUE, тогда функция BeginPaint вызывает обработку сообщения WM_ERASEBKGND с параметрами wParam= hDC, lParam= 0

неверный прямоугольник маркируется верным. Для этого BeginPaint вызывает функцию ValidateRect.

Если вам надо обязательно рисовать на всем устройстве (окне), а не только в зоне неверного прямоугольника, то перед вызовом функции BeginPaint, вы можете маркировать нужный прямоугольник или область как нуждающуюся в перерисовке.

2) Иногда необходимо получить хендл контекста для всей внутренней области окна. Для этого вы можете воспользоваться следующим способом:

hDC = GetDC (hWnd);

ReleaseDC (hWnd, hDC);

Этот способ часто применяется для рисования во внутренней области окна при обработке иных сообщений, чем WM_PAINT. Если вы собираетесь использовать его при обработке сообщения WM_PAINT, то помните про:

восстановление фона окна (так как обычно это делает BeginPaint)

удалите неверные прямоугольники после рисования (так, например, вы можете вызвать ValidateRect (hWnd, NULL); для маркирования всего окна верным).

3) Еще реже приходится рисовать во внешней (неклиентной, non-client) части окна, тогда вы можете воспользоваться таким способом:

hDC = GetWindowDC (hWnd);

ReleaseDC (hWnd, hDC);

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

Интересная особенность этой функции — если в качестве хендла окна ей передать NULL, то функция возвратит хендл контекста, соответствующего всему дисплею.

4) В некоторых случаях надо получить доступ ко всему устройству, например принтеру. Для этого вы должны использовать пару функций CreateDC. DeleteDC следующим образом:

hDC = CreateDC (lpszDriver, lpszDevice, lpszOutput, lpData);

Например, для рисования непосредственно на поверхности дисплея:

hDC = CreateDC («DISPLAY», NULL, NULL, NULL);

hDC = CreateDC («IBMGRX», «IBM Graphics», «LPT1:», NULL);

параметры имеют следующие значения:

— имя драйвера (имя файла без расширения)

— имя устройства (если один драйвер поддерживает несколько устройств)

— имя устройства вывода

— указатель на данные, передаваемые во время инициализации.

Функция CreateDC применяется сравнительно редко, так как первоначально она была ориентирована на работу с устройствами типа принтера или плоттера. Однако, для применения этой функции надо было анализировать информацию об используемом принтере (ах), содержащуюся в файле win.ini. Начиная с Windows 3.x появились специальная библиотека, реализующая стандартные диалоги и наиболее распространенные действия, включая процесс получения контекста принтера. См., например, функцию ChoosePrinter.

5) Иногда получаемый контекст нужен только для того, что бы узнать характеристики устройства. Тогда создается несколько упрощенный, так называемый информационный контекст:

hDC = CreateIC (lpszDriver, lpszDevice, lpszOutput, lpData);

параметры функции такие же, как и в предыдущем случае.

В самостоятельную группу надо выделить еще два способа: оба они позволяют получить контекст реально не существующего устройства. Один из них создает контекст устройства, похожего на реально существующее, но представленное только в памяти компьютера, а другой создает устройство, которое запоминает все операции по рисованию как команды, а затем может их воспроизвести на реальном устройстве.

6) Этот способ создает контекст так называемого совместимого устройства, оно реально не существует, но обладает характеристиками реально существующего.

// для получения контекста реального устройства годится любой

hRealDC= GetDC (hWnd);

// по хендлу контекста реально существующего устройства создается

// контекст совместимого устройства.

hCompatDC= CreateCompatibleDC (hRealDC);

// созданный таким образом совместимый контекст описывает устройство

// размером в 1 пиксел. Для нормальной работы с этим устройством

// его надо ассоциировать с битмапом, об этом — позже

// если контекст реального устройства нам больше не нужен, мы можем

ReleaseDC (hWnd, hRealDC);

// .. здесь мы можем использовать созданный совместимый контекст

// для освобождения совместимого контекста применяетсяфункция

Совместимые контексты (compatible DC, memory DC) предназначены для работы с битмапами. Для этого созданный совместимый контекст ассоциируется с конкретным битмапом, после чего появляется возможность выполнять рисование на этом битмапе, либо осуществлять передачу изображения между битмапом и другим контекстом устройства. Подробнее о применении совместимых контекстов устройства см. в разделе «Работа с зависимым от устройства битмапом».

7) Последний способ создает так называемый метафайл. Это устройство только лишь запоминает команды GDI в специальном файле, а затем может воспроизвести заданное изображение на реальном устройстве, «проигрывая» запомненные команды. Контекст метафайла существенно отличается от других контекстов информацией об устройстве, так как ни к какому устройству он не привязан и не на кого не похож. Поэтому такие параметры, как число бит на пиксель, число встроенных шрифтов и пр. не имеет для него никакого смысла.

hDC = CreateMetaFile (lpszFilename);

hMF = CloseMetaFile (hDC);

hEnhDC = CreateEnhMetaFile (lpszFilename);

hEnhMF = CloseEnhMetaFile (hDC);

Как использовать полученный хендл метафайла мы рассмотрим позже.

Используя приведенные методы вы можете получать требуемый контекст устройства. Обычно, после получения хендла контекста устройства, производятся требуемые настройки — выбор пера, шрифта и пр. при этом такие настройки приходится делать каждый раз при получении хендла контекста устройства. В некоторых случаях, если настройки отличаются от устанавливаемых по умолчанию и редко меняются, можно ускорить рисование, сохраняя произведенные изменения.

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

Контекст устройства

Перед тем, как начать рисовать, рассмотрим контекст устройства более подробно, чем в главе 3.

Если вы хотите рисовать на устройстве графического вывода (экране дисплея или принтере), сначала надо получить описатель контекста устройства (device context, DC). Передавая этот описатель, Windows тем самым дает вам право на использование самого устройства. Затем вы включаете этот описатель как параметр в функции GDI для того, чтобы сообщить Windows, на каком устройстве вы собираетесь рисовать.

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

Получение описателя контекста устройства

Windows предоставляет несколько методов для получения описателя контекста устройства. Если вы получаете описатель контекста устройства в теле обработчика сообщения, вы должны освободить его (удалить, вернуть системе) перед выходом из оконной процедуры. После того, как вы освободите описатель контекста устройства, его значение теряет смысл.

Наиболее общий метод получения контекста устройства и его освобождения состоит в использовании функций BeginPaint и EndPaint при обработке сообщения WM_PAINT:

hdc = BeginPaint(hwnd, &ps);

[другие строки программы]

Переменная ps — это структура типа PAINTSTRUCT. Поле hdc этой структуры — это описатель контекста устройства, который возвращается функцией BeginPaint . Структура PAINTSTRUCT содержит также структуру типа RECT с именем rcPaint (прямоугольник), определяющую прямоугольную область, содержащую недействительный (требующий перерисовки) регион клиентской области окна. Получив описатель контекста устройства от функции BeginPaint , вы можете рисовать только в пределах этого региона. Функция BeginPaint делает этот регион действительным.

Программы для Windows могут также получать описатель контекста устройства в теле обработчика сообщения, отличного от WM_PAINT:

[другие строки программы]

Полученный контекст устройства с описателем hwnd относится к клиентской (рабочей) области окна. Основная разница между использованием этих функций и комбинации функций BeginPaint и EndPaint состоит в том, что вы можете рисовать в пределах всей рабочей области окна, используя описатель контекста устройства, возвращенный функцией GetDC . Кроме того, функции GetDC и ReleaseDC не делают действительным (не требующим перерисовки) ни один недействительный регион клиентской области окна.

Программы для Windows могут также получать описатель контекста устройства, относящийся ко всему окну программы, а не только к его клиентской области:

[другие строки программы]

Этот контекст устройства включает заголовок окна, меню, полосы прокрутки и рамку окна в дополнение к клиентской области. Функция GetWindowDC редко используется в приложениях. Если вы хотите поэкспериментировать с ней, то вам следует обработать сообщение WM_NCPAINT («nonclient paint», рисование неклиентской области), которое генерируется Windows для перерисовки неклиентской области окна.

Функции BeginPaint , GetDC и GetWindowDC получают контекст устройства, связанный с конкретным окном на экране. Более общая функция для получения описателя контекста устройства — это функция CreateDC :

hdc = CreateDC(pszDriver, pszDevice, pszOutput, pData);

[другие строки программы]

Например, вы можете получить описатель контекста устройства всего дисплея так:

hdc = CreateDC(«DISPLAY», NULL, NULL, NULL);

Запись вне вашего окна обычно не принята, но это удобно для некоторых редко используемых приложений. (Хотя это и не документировано, вы можете получить описатель контекста устройства для экрана дисплея посредством вызова функции GetDC с параметром NULL.) В главе 15 мы будем использовать эту функцию для получения описателя контекста устройства принтера.

Иногда вам нужно только получить некоторую информацию о контексте устройства, и не надо ничего рисовать. В этих случаях вы можете получить описатель так называемого «информационного контекста» (information context), используя функцию CreateIC . Параметры этой функции такие же, как у функции CreateDC , например:

hdcInfo = CreateIC(«DISPLAY», NULL, NULL, NULL);

[другие строки программы]

Вы не можете осуществлять вывод на устройство, используя информационный контекст.

При работе с битовыми образами иногда может быть полезно получить «контекст памяти» (memory device context):

[другие строки программы]

Это достаточно общая концепция. Главное, что вам надо сделать, это выбрать битовый образ в контекст памяти, а затем вызвать функцию GDI для рисования битового образа. Мы обсудим это позднее в данной главе и используем рассмотренную методику в программе GRAFMENU из главы 10.

Как уже упоминалось раньше, метафайл — это набор вызовов GDI в двоичном виде. Вы можете создать метафайл, получая контекст метафайла:

[другие строки программы] hmf = CloseMetaFile(hdcMeta);

Пока контекст метафайла действителен вызов GDI, который вы осуществляете, используя hdcMeta , не вызывает вывода на устройство, а записывается в метафайл. Когда вы вызываете CloseMetaFile , описатель контекста становится недействительным. Функция возвращает описатель метафайла ( hmf ).

Получение информации из контекста устройства

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

iValue = GetDeviceCaps(hdc, iIndex);

Параметр iIndex — один из 28 идентификаторов, определенных в заголовочном файле Windows. Например, значение iIndex равное HORZRES заставляет функцию GetDeviceCaps вернуть ширину устройства в пикселях; значение VERTRES — высоту устройства в пикселях. Если hdc является описателем контекста устройства дисплея, то эту же информацию вы можете получить от функции GetSystemMetrics . Если hdc является описателем контекста устройства принтера, то тогда уже функция GetDeviceCaps возвращает высоту и ширину рабочей области принтера в пикселях.

Вы можете также использовать функцию GetDeviceCaps для определения возможностей устройства по обработке различных типов графики. Это неважно для видеомониторов, но становится очень важным при работе с принтерами. Например, большинство плоттеров не способны отображать битовые образы, и GetDeviceCaps сообщит вам об этом.

Программа DEVCAPS1

Программа DEVCAPS1, приведенная на рис. 4.1, частично отображает информацию, доступную посредством вызова GetDeviceCaps с использованием контекста устройства для дисплея. (Вторая, расширенная версия программы, DEVCAPS2, будет приведена в главе 15 для получения информации о принтере.)

Контекст устройства

Контекст устройства (англ.  Device Context ) является основным инструментом, применяемым в Windows для обеспечения независимости приложений от устройств.

Определение

Понятие «Контекст устройства» является частью графической подсистемы Windows GDI.

Контекст устройства — это внутренняя структура, для управления информацией о выходном устройстве. Она содержит информацию о параметрах и атрибутах вывода графики на устройство (например, дисплей или принтер). Вместо направления вывода непосредственно на аппаратное устройство, приложение направляет его в контекст устройства, а затем Windows пересылает вывод в аппаратное устройство.

В GDI существуют пять типов контекста устройства — связанный с дисплеем (Display DC), принтером (Printer DC), контекст виртуального устройства в памяти (Memory DC), контекст метафайла (Metafile DC) и специальный вид контекста — информационный (Information DC).

Пример

Ниже приведён пример, показывающий этапы, необходимые для вывода строки в клиентскую область окна посредством обращения к контексту устройства:

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

Функции

Функции WinAPI для работы с контекстами устройства:

  1. CreateDC — создает контекст устpойства для устpойства DriverName.
  2. DeleteDC — удаляет контекст устpойства. Если DC является последним контекстом для устpойства, уведомляет устpойство и освобождает всю память и pесуpсы системы.
  3. GetDC — считывает контекст дисплея для выполнения опеpаций интеpфейса GDI в области пользователя окна.
  4. GetDCEx
  5. GetWindowDC — считывает контекст дисплея, обычно используемый для pаскpаски в окне областей, не являющихся областями пользователя.
  6. ReleaseDC — освобождает общий или оконный (не влияющий на класс или локальность) контекст устpойства, делая его доступным для дpугих пpикладных задач.
  7. RestoreDC — восстанавливает контекст устpойства в пpедыдущее состояние, указанное паpаметpом SaveDC, из стека контекста. Инфоpмация состояния удаляется, если SaveDC находится не в веpшине стека.
  8. SaveDC — сохpаняет текущее состояние DC в стеке контекста.
  9. WindowFromDC
  • Windows API

Wikimedia Foundation . 2010 .

Полезное

Смотреть что такое «Контекст устройства» в других словарях:

контекст устройства — — [Е.С.Алексеев, А.А.Мячев. Англо русский толковый словарь по системотехнике ЭВМ. Москва 1993] Тематики информационные технологии в целом EN device context … Справочник технического переводчика

информационный контекст — Информационная составляющая контекста устройства. [Е.С.Алексеев, А.А.Мячев. Англо русский толковый словарь по системотехнике ЭВМ. Москва 1993] Тематики информационные технологии в целом EN information context … Справочник технического переводчика

GDI — У этого термина существуют и другие значения, см. GDI (значения). GDI (Graphics Device Interface, Graphical Device Interface)  один из трёх основных компонентов или «подсистем», вместе с ядром и Windows API составляющих пользовательский… … Википедия

Контекстно-зависимые вычисления — (англ. Context aware computing) изучают контекстно зависимые системы (комбинация аппаратного и программного обеспечения), которые анализируют состояние пользователя и окружающую среду, и адаптируют свою работу под изменяющиеся условия.… … Википедия

область — 3.1 область (area): Трехмерная область или пространство. Источник … Словарь-справочник терминов нормативно-технической документации

ПОЛИТИКА — (греч. гос. или обществ. дела, от государство), сфера деятельности, связанная с отношениями между классами, нациями и др. социальными группами, ядром которой является проблема завоевания, удержания и использования гос. власти. Самое… … Философская энциклопедия

Б41 — У этого термина существуют и другие значения, см. Б41 (значения). Б41 (англ. B41)  российский 16 разрядный микроконтроллер, разработанный зеленоградской фирмой Kedah Electronics Engineering в 2004 году. Содержание 1 Общие сведения … Википедия

Технические — 19. Технические указания по технологии производства строительных и монтажных работ при электрификации железных дорог (устройства электроснабжения). М.: Оргтрансстрой, 1966. Источник: ВСН 13 77: Инструкция по монтажу контактных сетей промышленного … Словарь-справочник терминов нормативно-технической документации

1: — Терминология 1: : dw Номер дня недели. «1» соответствует понедельнику Определения термина из разных документов: dw DUT Разность между московским и всемирным координированным временем, выраженная целым количеством часов Определения термина из… … Словарь-справочник терминов нормативно-технической документации

ПАТРИСТИКА — (лат. patres отцы) направление философско теологической мысли 2 8 вв., связанное с деятельностью раннехристианских авторов Отцов Церкви. Семантико аксиологические источники оформления П. античная философия (общерациональный метод и конкретное… … История Философии: Энциклопедия

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *