- •Интерактивные графические системы
- •Лабораторная работа 1-2.
- •Создание программ построения графиков, используя графические примитивы api Windows. Создание меню, для отображения различных графических объектов
- •Содержание
- •Мировые и экранные координаты.
- •Графические библиотеки.
- •Программирование графики в Windows.
- •Контекст устройства
- •Получить контекст устройства
- •Контекст устройства в Windows программах.
- •Аналогичную схему создания и уничтожения пера можно представить в виде.
- •Графические примитивы api Windows.
- •Шрифты True Type в Windows программах.
- •Обработка сообщений меню Windows программы
- •Задание к выполнению лабораторной работы.
- •Часть 1. Написать Windows программу для своего варианта, которая рисует сразу два графика в одних координатных осях.
Контекст устройства в 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);