пользователей: 30398
предметов: 12406
вопросов: 234839
Конспект-online
РЕГИСТРАЦИЯ ЭКСКУРСИЯ

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

Windows является ОС, которая не зависит от устройств и их параметров. Такая возможность реализуется через так называемые контексты устройств.

Контекст устройства (Device Context – DC) является связующим звеном между прикладной программой и устройством.

В Windows поддерживаются следующие типы контекстов устройств: 

контекст дисплея (обеспечивает работу с дисплеем);

контекст принтера (обеспечивает работу с принтером);

контекст в памяти (моделирует в памяти устройство вывода);

информационный контекст (служит для получения данных о параметрах устройства).

С помощью контекста устройства можно выполнять операции вывода, а также управлять характеристиками устройства. К таким характеристикам можно отнести:

bitmap(битовая карта, изображение), отображаемый в окне,

перо для прорисовки линий,

кисть,

палитра,

шрифт

и т.д.

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

Манипулирование контекстом происходит через его описатель.

 

Контекст дисплея

Windows поддерживает три типа контекста дисплея – контекст класса, приватный контекст и общий контекст.

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

Ярким примером такого рода приложений являются настольные издательские системы, графические пакеты и т.д.

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

Контекст класса является устаревшим и поддерживается только для обеспечения совместимости с предыдущими версиями Windows.  Microsoft не рекомендует использовать его при разработке новых приложений и рекомендует использовать только приватный контекст.

Общие контексты хранятся в кэше, управляемом системой. Его описатель можно получает с помощью функций GetDC(…), GetDCEx(…) или BeginPaint(…).

После того, как программа закончит работать с дисплеем, она должна освободить контекст, вызвав функцию ReleaseDC(…) или EndPaint(…) соответственно.

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

Приватный контекст отличается от общего тем, что сохраняет изменения даже после того, как прикладная программа освободила его.

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

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

Для работы с приватным контекстом необходимо при регистрации класса окна указать стиль CS_OWNDC. После этого программа может получать описатель контекста устройства точно так же, как и в случае общего контекста. Система сама удаляет приватный контекст в том случае, когда удаляется окно.

При работе с контекстами необходимо запомнить, что описатель контекста устройства с помощью функции BeginPaint(…) необходимо получать только в случае обработки сообщения WM_PAINT. Во всех остальных случаях необходимо использовать функции GetDC(…) или GetDCEx(…).

Контекст принтера:

При необходимости вывода на принтер программа должна создать контекст устройства с помощью функции CreateDC(…).

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

После распечатки прикладная программа должна удалить контекст принтера с помощью функции DeleteDC(…) (а не ReleaseDC(…)!).

Контекст в памяти

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

Контекст в памяти не является независимым. Он обязательно создается как совместимый с тем устройством или окном, на которое предполагается копировать информацию.

Алгоритм работы с контекстом в памяти состоит из нескольких шагов:

1.Получение описателя контекста дисплея hDC для окна, в которое будет осуществляться вывод изображения.
2.Получение описателя bitmap'а hBitmap, который будет отображаться в окне. 
3.Получение совместимого с hDC контекста в памяти hCompatibleDC (для хранения изображения) с помощью функции CreateCompatibleDC(…).
4.Выбор изображения hBitmap как текущего для контекста в памяти hCompatibleDC.
5.Копирование изображения контекста в памяти hCompatibleDC на контекст устройства hDC.
6.Освобождение контекста hCompatibleDC.
7.Удаление hBitmap.
8.Освобождение контекста устройства hDC.

Именно этот способ и используется в большинстве программ для копирования изображения.

Информационный контекст

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

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

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

После того, как надобность в информационном контексте миновала, программа должна удалить его с помощью функции DeleteDC(…).


26.12.2015; 23:53
хиты: 0
рейтинг:0
для добавления комментариев необходимо авторизироваться.
  Copyright © 2013-2024. All Rights Reserved. помощь