Лекция 3 Контекст устройства Понятие контекста устройства
Одним из основополагающих понятий в ОС Windows является понятие контекста. Контекст является объектом операционной системы посредством которого осуществляется вывод информации на внешнее устройство (монитор, принтер и т.п.). Рассмотрим это понятие более подробно на примере вывода графической информации на экран монитора.
Традиционно сложилась следующая схема вывода (рис. 3.1.).
Рис 3.1. Порядок графического вывода в ОС MS DOS
Программа формирует графическое изображение путем записи в видео памяти соответствующей информации. При этом программа должна учитывать графический режим (текстовый или графический), тип адаптера (CGA, VGA, SVGA и т.п.), а также особенности конкретной видео карты, которая преобразует информацию из видео памяти в RGB сигналы, передаваемые на монитор.
Данная схема хорошо работает в случае однозадачного режима, когда адресным пространством видео памяти владеет только одна программа. Поэтому, эта схема получила распространение в ОС типа MS DOS.
В случае многозадачной ОС ситуация несколько другая. Одновременно графический вывод могут осуществлять несколько программ, причем, так как они не зависят друг от друга, они не должны задумываться о состоянии видео памяти и режимах других программ. Более того, в силу рассмотренных в первой лекции свойств ОС, программа должна быть независимой от аппаратной части (в данном случае – видео карты), то есть формировать изображение без учета формата данных в видео памяти. В связи с этим между программой и видео памятью было введено некоторое промежуточное звено, получившее название контекста.
Контекст – структура данных, формируемая операционной системой, хранящая информацию о параметрах и характеристиках устройства вывода, посредством которого программа осуществляет графический вывод информации. Благодаря введению контекста процесс вывода информации изменился и имеет следующий вид (рис. 3.2):
Рис. 3.2. Схема графического вывода в ОС WINDOWS
Каждая программа получает в свое расположение собственный контекст и осуществляет в него вывод изображения. Таким образом, программа может не заботиться о согласовании с другими программами (эту функцию выполняет операционная система). Кроме этого, в этом случае программа рисует в виртуальные координаты (начиная с координаты 0;0), а операционная система перемещает изображение окна уже в физические координаты. Поэтому, программе не нужно заботится о положении окна на экране монитора.
Введение некоторого логического "буфера" между программой и видео памятью позволило решить еще очень важную проблему – аппаратной независимости программного обеспечения. Контекст является строго стандартизированной структурой данных и, более того, АРI содержит стандартный набор функций работы с ним (считается, что все программы осуществляют графический вывод только с использованием этих функций). Сопряжение логического рисунка (в контексте) с конкретной видео картой осуществляется самой операционной системой на основе установленных драйверов. Тем самым достигается, что на любом компьютере (на котором установлена WINDOWS) изображение будет выглядеть так же.
Программная модель контекста
В программе (см. Лекцию 2) контекст представлен своим описателем и объявляется следующим образом:
HDC hdc;
Для того, чтобы начать работу с контекстом, необходимо его получить у операционной системы. Следует отметить, что контекст лучше запрашивать только в момент графического вывода (так как на поддержание контекста требуется оперативная память и время работы ОС), и сразу же закрывать его после завершения рисования. Существует два способа получения контекста, отличающихся функциями АРI, которые для этого используются.
Первый способ.
hdc = BeginPaint(hWnd, &ps); // Начать графический вывод
// графический вывод
. . . . . . . . . . .
EndPaint(hWnd, &ps); // Закончить графический вывод
Второй способ.
hdc = GetDC(hWnd); // Начать графический вывод
// графический вывод
. . . . . . . . . . .
ReleaseDC(hWnd, hdc); // Закончить графический вывод
Разница между первым и вторым способом будет пояснена ниже.
Параметр hWnd – описатель того окна, в котором требуется перерисовка. Описатель контекста позволяет программе рисовать только в пределах клиентской области окна, описатель которого использовался при его создании. В каждом окне выделяют несколько областей:
рабочая область – вся область, занимаемая окном на экране;
неклиентская область – включает стандартные элементы окна, которые, в общем случае, отрисовываюся операционной системой: рамка, строка заголовка, кнопки закрыти, минимизации и т.п., меню;
клиентская область – вся оставшаяся от неклиентской рабочая область окна.
Описатель контекста используется во всех функциях, связанных с графическим выводом. Приведем примеры функций, непосредственно связаных с рисованием:
Rectangle(hdc, 20, 20, 100, 300);// рисует прямоугольник с указанными координатами верхней левой и нижней правой точками;
Ellipse(hdc, 20, 20, 100, 300); // рисует эллипс, вписанный в прямоугольник с указанными координатами;
LineTo(hdc, 20, 20); // рисует линию из текущих координат пера в указанные (понятие пера будет раскрыто позже в этой лекции).
Как видно из приведенных примеров, первый параметр у всех графических функций – описатель контекста устройства.