1.81M
Category: programmingprogramming

Информационные технологии. Часть 2. Тема 7. Создание графических изображений средствами библиотеки WinAPI

1.

Санкт-Петербургский государственный
архитектурно-строительный университет
кафедра информационных технологий
Информационные технологии. Часть 2
Тема 7
Создание графических изображений средствами
библиотеки WinAPI
Букунов Сергей Витальевич
к.т.н., доцент, доцент

2.

СОЗДАНИЕ ГРАФИЧЕСКИХ
ИЗОБРАЖЕНИЙ С
ПОМОЩЬЮ БИБЛИОТЕКИ
WinAPI

3.

Основные сведения
Для работы с графическими изображениями в Windows используются
объекты.
Объектом называется структура данных, которая представляет собой
некоторый системный ресурс.
В операционной системе Windows используются объекты нескольких
категорий, например:
• User (объекты интерфейса пользователя);
• Graphic Device Interface (объекты интерфейса графических
устройств).
Категория User содержит в себе объекты, которые используются
приложением для интерфейса с пользователем, например, окна и
курсоры.
Категория Graphic Device Interface (GDI) включает объекты, которые
используются для вывода информации на графические устройства,
например, кисти и перья.

4.

Дескрипторы
Каждому объекту ставится в соответствие дескриптор (handle).
Дескриптор имеет тип HANDLE. Поэтому имена всех дескрипторов
начинаются с буквы H.
Примеры. HWND, HDC, HPEN, HBRUSH, HFONT.
Дескриптор объекта является по сути структурной переменной и
представляет собой запись в таблице, которая поддерживается системой и
содержит адрес объекта и средства для идентификации типа объекта.
Дескрипторы объектов создаются операционной системой и возвращаются
функциями Win32 API, которые создают объекты.
За редким исключением, эти функции имеют вид CreateObject(), где слово
Object заменяется именем конкретного объекта.
Пример. Для создания пера для рисования линий используется функция
CreatePen().

5.

Дескрипторы
После завершения работы с объектом его дескриптор нужно закрыть с
помощью функции CloseHanle().
Функция CloseHandle() удаляет дескриптор объекта, но сам объект
удаляется не всегда. Дело в том, что на один и тот же объект могут
ссылаться несколько дескрипторов, которые создаются другими
функциями для доступа к созданному объекту.
Функция CloseHandle() уничтожает объект только в том случае, если
на него больше не ссылается ни один дескриптор.
Для гарантированного удаления объекта лучше использовать функцию
DeleteObject().

6.

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

7.

Контекст устройства
Программа
Контекст устройства
Устройство вывода (экран)

8.

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

9.

Связывание контекста устройств с графическим объектом
Для закрепления за контекстом устройства конкретного графического
объекта (пера, кисти, файла, курсора и т.д.) в WinAPI используется
функция SelectObject().
Аргументами этой функции являются дескриптор контекста
устройства и дескриптор графического объекта.
Пример объявления функции SelectObject(), связывающей с
контекстом устройства перо для рисования линий:
SelectObject(HDC, HPEN);
Замечание. В каждый момент времени контексту устройства может
быть сопоставлен только один логический объект, который должен
сразу же удаляться, как только он перестает использоваться.

10.

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

11.

Стандартная схема для создания графического
изображения в WinAPI
Этапы создания графического изображения в консольном окне:
получение дескриптора консольного окна (HWND);
получение дескриптора контекста устройства (HDC);
получение дескриптора графического объекта, которое будет
использоваться для создания изображения (HPEN, HBRUSH и т.д.);
связывание дескриптора графического объекта с контекстом
устройства с помощью функции SelectObject();
создание графического изображения с помощью выбранного
графического объекта и соответствующих функций WinAPI;
удаление графического объекта из контекста устройства с помощью
функции DeleteObject();
освобождение контекста устройства с помощью функции
ReleaseDC().

12.

Работа с цветом WinAPI
Цвет точки представляет собой 32-битное число, заданное в системе
RGB, в которой интенсивность каждого из трех цветов (красного
(Red), зеленого (Green) и синего (Blue) задается любым числом в
диапазоне от 0 до 255.
Для установки цвета можно использовать следующие подходы:
явно использовать макрос RGB(), параметрами которого служат три
целочисленные переменные, устанавливающие интенсивность
красного, зеленого и синего цветов в диапазоне от 0 до 255;
использовать структурную переменную типа COLORREF, для
инициализации которой конкретными значениями использовать
макрос RGB();
создать собственную структуру с тремя целочисленными
переменными для хранения значений интенсивности красного,
зеленого и синего цветов.

13.

Основные графические объекты WinAPI
Для создания графических изображений в WinAPI используются три
основных типа объектов:
точка (Pixel);
перо (Pen);
кисть (Brush).

14.

Основные графические объекты WinAPI. Точка
Для перемещения по экрану можно использовать:
структурные переменные типа COORD;
структурные переменные типа POINT.
В обоих случаях каждая переменная содержит два целых числа (типа
int), которые определяют координаты точки в пикселях.
Отличие заключается в обозначении полей (x, y) структурных
переменных: в переменных типа COORD используются заглавные
буквы X и Y, а в переменных типа POINT – прописные буквы x и y.

15.

Основные графические объекты WinAPI. Точка
Для создания на экране точки определенного цвета используется
функция SetPixel().
Аргументы функции:
дескриптор контекста устройства;
координаты точки;
цвет точки.
COLORREF SetPixel(
HDC hdc, // дескриптор контекста устройства
int x,
// x-координата точки
int y,
// y- координата точки
COLORREF Color); // цвет точки

16.

Основные графические объекты WinAPI. Перо
Для создания пера используется функция CreatePen().
Аргументы функции:
стиль пера (целочисленная переменная типа int);
ширина (толщина) пера (целочисленная переменная типа int);
цвет пера.
HPEN CreatePen(
int style,
// стиль пера
int width,
// толщина пера
COLORREF Color); // цвет пера
При успешном завершении функция возвращает дескриптор пера, а в
случае неудачи – константу NULL.

17.

Перо. Стили пера
Для задания стиля пера используются следующие константы:
PS_SOLID – перо рисует сплошные линии;
PS_DASH – перо рисует штриховые линии; для реализации этого режима
толщину пера необходимо задавать меньше или равной 1 пикселю;
PS_DOT - перо рисует пунктирные линии; для реализации этого режима
толщину пера необходимо задавать меньше или равной 1 пикселю;
PS_DASHDOT – перо рисует линии из чередующихся штрихов и точек;
для реализации этого режима толщину пера необходимо задавать меньше
или равной 1 пикселю;
PS_DASHDOTDOT – перо рисует линии из чередующихся штрихов и
двойных точек; для реализации этого режима толщину пера необходимо
задавать меньше или равной 1 пикселю;
PS_NULL – невидимое перо.

18.

Перо. Стили пера

19.

Основные графические объекты WinAPI. Кисть
Кисть используется для создания закрашенных замкнутых объектов.
Для создания кисти используется функция CreateSolidBrush().
У функции только один аргумент – цвет кисти.
HBRUSH CreateSolidBrush(
COLORREF Color); // цвет пера
При успешном завершении функция возвращает дескриптор кисти, а в
случае неудачи – константу NULL.

20.

Создание графических примитивов. Линия
Для перемещения в заданную точку используется функция
MoveToEx(), устанавливающая перо в заданную точку экрана.
Координаты точки (x, y) задаются в пикселях и отсчитываются
относительно левого верхнего угла окна.
Аргументы функции:
• дескриптор контекста устройства;
• координаты точки (x, y) в пикселях;
• указатель на структуру POINT, который возвращает предыдущее
положение; если в качестве этого аргумента используется NULLуказатель, то предыдущая позиция не возвращается:
При успешном завершении функция возвращает ненулевое значение
(значение типа BOOL).

21.

Создание графических примитивов. Функция MoveToEx()
BOOL MoveToEx(
HDC hdc, // дескриптор контекста устройства
int x,
// x-координата точки
int y,
// y- координата точки
LPPOINT lpPoint); // указатель на структуру POINT

22.

Создание графических примитивов. Функция LineTo()
Функция LineTo() рисует линию из точки, в которой установлено
перо, в точку, координаты которой являются аргументами функции.
Аргументы функции:
• дескриптор контекста устройства;
• координаты точки (x, y) в пикселях:
При успешном завершении функция возвращает ненулевое значение
(значение типа BOOL).
BOOL LineTo(
HDC hdc, // дескриптор контекста устройства
int x,
// x-координата конечной точки
int y);
// y- координата конечной точки

23.

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

24.

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

25.

Создание графических примитивов.
Закраска прямоугольника «вручную» (без использования
кисти)

26.

Создание графических примитивов.
Закраска прямоугольника «вручную»

27.

Создание графических примитивов
Общие комментарии.
Для прорисовки простых графических примитивов (прямоугольник,
треугольник, ромб, пирамида и т.п.) можно просто использовать
массив их вершин (массив значений типа POINT), а затем соединить
эти вершины с помощью функции LineTo().
Для прорисовки более сложных фигур (круг, sin, cos и др.) необходимо
задать закон изменения координат точек, а уже затем соединять их с
помощью функции LineTo().

28.

СОЗДАНИЕ ГРАФИЧЕСКИХ
ИЗОБРАЖЕНИЙ С
ПОМОЩЬЮ ВСТРОЕННЫХ
ФУНКЦИЙ БИБЛИОТЕКИ
WinAPI

29.

Функция Rectangle()
Функция Rectangle() рисует прямоугольник.
Аргументы функции:
• дескриптор контекста устройства;
• координаты левого верхнего угла (x, y) в пикселях;
• координаты правого нижнего угла (x, y) в пикселях.
BOOL Rectangle(
HDC hdc, // дескриптор контекста устройства
int x_left_top,
// x-координата левого верхнего угла
int y_left_top,
// y- координата левого верхнего угла
int x_right_bottom,
// x-координата правого нижнего угла
int y_right_bottom);
// y- координата правого нижнего угла
При успешном завершении функция возвращает ненулевое значение (значение
типа BOOL).

30.

Создание графических примитивов.
Закрашенный прямоугольник

31.

Создание графических примитивов.
Закрашенный прямоугольник

32.

Создание графических примитивов.
Закрашенный прямоугольник с границей

33.

Создание графических примитивов.
Закрашенный прямоугольник с границей

34.

Функция Ellipse()
Функция Ellipse() рисует эллипсы и круги (частный случай эллипса).
Аргументы функции:
• дескриптор контекста устройства;
• координаты левого верхнего угла описывающего прямоугольника (x, y) в пикселях;
• координаты правого нижнего угла описывающего прямоугольника (x, y) в пикселях.
BOOL Ellipse(
HDC hdc, // дескриптор контекста устройства
int x_left_top,
// x-координата левого верхнего угла
int y_left_top,
// y- координата левого верхнего угла
int x_right_bottom,
// x-координата правого нижнего угла
int y_right_bottom);
// y- координата правого нижнего угла
При успешном завершении функция возвращает ненулевое значение (значение типа
BOOL).

35.

Создание графических примитивов.
Закрашенный эллипс с границей

36.

Создание графических примитивов.
Закрашенный эллипс с границей

37.

Функция Polygon()
Функция Polygon() рисует произвольный многоугольник.
Аргументы функции:
• дескриптор контекста устройства;
• массив координат вершин многоугольника;
• количество вершин многоугольника.
BOOL Polygon(
HDC hdc, // дескриптор контекста устройства
POINT* points, // указатель на тип POINT (хранит адрес массива)
int size);
// кол-во вершин многоугольника (размерность массива)
При успешном завершении функция возвращает ненулевое значение
(значение типа BOOL).

38.

Создание графических примитивов.
Закрашенный многоугольник с границей

39.

Создание графических примитивов.
Закрашенный многоугольник с границей

40.

ВЫВОД ТЕКСТОВОЙ
ИНФОРМАЦИИ В
ГРАФИЧЕСКОМ РЕЖИМЕ

41.

Функции для работы с текстом
Для вывода текста в графическом окне можно использовать следующие
функции:
• SetBkColor(HDC, COLORREF) – функция устанавливает цвет фона для
выводимого текста; аргументы функции: дескриптор контекста устройства
и цвет;
• SetTextColor(HDC, COLORREF) – функция устанавливает цвет шрифта;
аргументы функции: дескриптор контекста устройства и цвет;
• TextOut(HDC, int, int, LPCWSTR, int) – функция выводит текст в
заданное место окна; аргументы функции:
дескриптор контекста устройства;
координаты (в пикселях) точки, начиная с которой будет выводиться текст;
текст в виде строки (тип данных – LPCWSTR (указатель на строку));
количество выводимых символов (тип данных – int).
По умолчанию на экран выводится черный текст на сером фоне.

42.

Вывод текста с параметрами по умолчанию

43.

Вывод текста с параметрами по умолчанию

44.

Вывод текста с установленными параметрами

45.

Вывод текста с установленными параметрами

46.

Создание собственных шрифтов
Операционная система Windows располагает набором встроенных
шрифтов.
Однако интерфейс WinAPI позволяет создавать и свои собственные
шрифты.
С точки зрения логики работы приложения шрифт представляет собой
графический объект, такой же как перо, кисть, курсор и проч.
Поэтому алгоритм работы со шрифтами аналогичен алгоритму работы
с другими графическими объектами, а именно:
сначала надо получить от операционной системы дескриптор
шрифта (переменную типа HFONT);
затем с помощью функции SelectObject() связать контекст
устройства с используемым шрифтом.

47.

Создание собственных шрифтов. Функция CreateFont()
Для получения дескриптора шрифта используется функция
CreateFont() со следующими аргументами:
HFONT CreateFont(
int nHeight,
// высота шрифта
int nWidth,
// средняя ширина символа
int nEscapement,
// угол наклона
int nOrientation,
// угол ориентации базисной линии
int fnWeight,
// толщина шрифта
DWORD fdwItalic, // описатель параметра курсивного шрифта
DWORD fdwUnderline, // описатель параметра подчеркивания
DWORD fdwStrikeOut,
// описатель параметра зачеркивания

48.

Создание собственных шрифтов. Функция CreateFont()
DWORD fdwCharSet,
// идентификатор набора символов
DWORD fdwOutputPrecision, // точность вывода
DWORD fdwClipPrecision, // точность отсечения
DWORD fdwQuality,
// качество вывода
DWORD fdwPitchAndFamily, // шаг между символами шрифта и
семейство
LPCTSTR lpszFace
// имя гарнитуры шрифта
);

49.

Создание собственных шрифтов. Функция CreateFont()

50.

Создание собственных шрифтов. Функция CreateFont()

51.

Создание собственных шрифтов. Функция CreateFont()

52.

Создание собственных шрифтов. Функция CreateFont()

53.

ВЫВОД ЧИСЛОВОЙ
ИНФОРМАЦИИ В
ГРАФИЧЕСКОМ РЕЖИМЕ

54.

Функции для работы с числами
Для вывода чисел в графическом режиме также используется функция
TextOut(), которая выводит текст (т.е. строку).
Поэтому для вывода числовой информации необходимо сначала
преобразовать число в текстовую строку, а затем вывести эту строку в
окне приложения с помощью функции TextOut().
Для преобразования чисел в текстовые строки можно использовать
следующие функции,
• wsprintf();
• _itoa_s();
• format();
• to_string().

55.

Функции для работы с числами. Функция _itoa_s()
Для вывода чисел в графическом режиме наиболее удобно
пользоваться функцией _itoa_s().
Аргументы функции:
число, которое необходимо вывести в окне приложения;
строка, в которую будет записано строковое представление
выводимого числа;
основание системы счисления для выводимого числа (для
десятичных чисел – это 10).
Замечание. Для вывода в графическом режиме комбинированной
информации, содержащей текст и цифры, можно использовать:
стандартную функцию для конкатенации строк strcat() из
встроенного класса string;
метод Format().

56.

Функции для работы с числами. Функция _itoa_s()

57.

Функции для работы с числами. Функция _itoa_s()

58.

Функции для работы с числами. Функция to_string()
English     Русский Rules