Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ИГС / Labor_01.doc
Скачиваний:
13
Добавлен:
17.04.2018
Размер:
524.8 Кб
Скачать

Контекст устройства в Windows программах.

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

HDC hdc; //идентификатор контекста устройства

PAINTSTRUCT ps; //структура для работы контекста

hdc = BeginPaint(hwnd, &ps);

Окно приложения имеет идентификатор hwnd. (handle of window). Выбранный контекст устройства имеет идентификатор hdc (handle of device context). Функция BeginPaint() связывает выбранный контекст hdc с окном приложения hwnd. Кроме того, функция BeginPaint() заполняет структуру PAINTSTRUCT.

После рисования нужно освободить контекст устройства. Для освобождения контекста нужно использовать функцию EndPaint(). Таким образом, для работы с контекстом окна на экране монитора используется пара функций BeginPaint() и EndPaint(). Схему применения этих функций можно представить в виде.

HDC hdc;

PAINTSTRUCT ps;

hdc = BeginPaint(hwnd, &ps);

 //рисование

EndPaint(hwnd, &ps);

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

HDC hdc;

hdc = GetDC(hwnd);

 //рисование

ReleaseDC(hwnd, hdc);

Проведите эксперимент. Запустите программу GraphWin.exe, и меняйте размеры окна приложения, или перемещайте окно по экрану монитора. Вы заметите, что изображение нарисованного графика не исчезает. Это связано с тем, что на все ваши действия с окном, система посылает окну сообщение WM_PAINT. Ваша программа в ответ рисует график снова и снова. При использовании функций GetDC() и ReleaseDC() такого не происходит.

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

Сначала создаем кисть с помощью функции CreateSolidBrush().

hbrush = CreateSolidBrush(RGB(0, 0, 200));

Созданная кисть имеет идентификатор hbrush (handle of brush). Кисть hbrush имеет следующие параметры: стиль - сплошной, цвет - синий.

Далее выбираем кисть hbrush в контекст устройства hdc. После этого в контексте устройства будет находиться новая кисть. Чтобы сохранилась информация о старой кисти, необходимо использовать для старой кисти свой идентификатор hbrushOld.

hbrushOld = (HBRUSH)SelectObject(hdc, hbrush);

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

Уничтожение созданной кисти hbrush выполняется функцией DeleteObject(). Перед уничтожением новой кисти hbrush, надо восстановить в контексте hdc кисть по умолчанию hbrushOld. Схему создания и уничтожения кисти можно представить в виде.

hbrush = CreateSolidBrush(RGB(0, 0, 200));

 //рисование

SelectObject(hdc, hbrushOld);

DeleteObject(hbrush);

Соседние файлы в папке ИГС