Создание простого графического приложения.pptx
- Количество слайдов: 24
СОЗДАНИЕ ПРОСТОГО ГРАФИЧЕСКОГО ПРИЛОЖЕНИЯ В среде Visual C++ 2010 Иванов Е. А. доц. кафедры МОИСи. И МЭСИ, 2013
Создаем новый проект
Слева выбираем шаблон Win 32 В данном шаблоне выбираем Win 32 Project Задаем название проекта, например graph
В появившемся окне нажимаем Finish
Перед нами окно с шаблоном приложения Win 32
В данном шаблоне нас интересует часть кода, которая обрабатывает сообщение Windows – WM_PAINT Именно в этой части будет располагаться код отвечающий за рисование.
Посмотрим внимательнее на этот код. Функция Begin. Paint возвращает в переменную hdc, объявленную ранее как HDC hdc; Эта переменная будет хранить ссылку на контекст открытого функцией Begin. Paint устройства вывода изображения, используя эту ссылку осуществляется вывод графических примитивов на устройство вывода.
Рассмотрим несколько функций рисования графических примитивов. Set. Pixel(HDC hdc, int X, int Y, COLORREF color ); Устанавливает пиксель в координаты текущего окна X, Y с цветом color. В качестве цвета можно использовать как числовое значение 0 x 00 bbggrr, где rr, gg и bb красная, зеленая и синяя составляющая цвета. Пример: Set. Pixel(hdc, 100, 0 x 00 ff 0000);
Для задания цвета так же имеется макрос RGB, возвращающий цвет пикселя, он определен как: #define RGB(r, g, b) ((COLORREF) (((BYTE)(r) | ((WORD) ((BYTE)(g)) <8 )) | (((DWORD) (ВYTЕ) (P)) <16 ))) Пример: Set. Pixel(hdc, 100, RGB(0, 0, 255)); Имеются и другие макросы (например, CMYK)
COLORREF Get. Pixel(HDC hdc, int X, int Y); Возвращает цвет пикселя в координатах текущего окна X, Y.
Для рисования линий и других графических примитивов более подходят функции работы с перьями. Перо перед использованием создается с помощью функции Create. Pen. Эта функция создает логическое перо, которое задает указанный стиль, ширину, и цвет пера. Перо перед использованием выбирается в контекст устройства.
HPEN Create. Pen ( int COLORREF ); Pen. Style, n. Width, cr. Color // стиль пера // ширина // цвет Стиль пера задают константы: • PS_SOLID - сплошная линия. • PS_DASH - штриховая линия. • PS_DOT - пунктирная линия. • PS_DASHDOT - штрих пунктирная линия. • PS_DASHDOTDOT - чередующиеся черточки и двойные точки. • PS_NULL - невидимое перо. • PS_INSIDEFRAME - перо для линий, выводимых внутри рамки закрытых форм (например, Ellipse, Rectangle, Round. Rect, Pie, и Chord функции).
Функция Select. Object выбирает объект (в данном случае перо) в указанный контекст устройства. Новый объект заменяет предыдущий объект того же самого типа и возвращает HDC заменяемого объекта. HGDIOBJ Select. Object ( HDC hdc, HGDIOBJ hgdiobj ); // дескриптор контекста устройства // дескриптор объекта который вибирается
Функция Select. Object выбирает объект (в данном случае перо) в указанный контекст устройства. Новый объект заменяет предыдущий объект того же самого типа и возвращает HDC заменяемого объекта. HGDIOBJ Select. Object ( HDC hdc, HGDIOBJ hgdiobj ); // дескриптор контекста устройства // дескриптор объекта который вибирается HPEN h. Pen=Create. Pen(PS_SOLID, 2, RGB(255, 0, 0)); // Выбираем созданные объекты в контекст устройства HPEN h. Pen. Old = Select. Object(h. Dc, h. Pen); Select. Object(h. Dc, h. Pen. Old); Delete. Object(h. Pen. Old);
Для рисования перьями используются функции: • BOOL Move. To. Ex(HDC hdc, int x 1, int y 1, LPPOINT lp. Point) Перемещает точку начала рисования линии в указанные координаты. LPPOINT lp. Point - адрес старой текущей позиции • BOOL Line. To(int x 2, int y 2) Рисует линию, начиная с текущей позиции, заданной функцией Move. To до указанных координат. • BOOL Rectangle(HDC hdc, int x 1, int y 1, int x 2, int y 2) Рисует прямоугольник, размер которого определяется координатами верхнего (x 1, y 1) и нижнего (x 2, y 2) угла. Используется текущее перо, а для заполнения текущая кисть.
• BOOL Ellipse(HDC hdc, int x 1, int y 1, int x 2, int y 2) Рисует эллипс, вписанный в прямоугольник, размер которого определяется координатами верхнего (x 1, y 1) и нижнего (x 2, y 2) угла. Эллипс заполнен белым цветом и обведен линией пера контекста устройства. Используется текущее перо, а для заполнения текущая кисть. • BOOL Round. Rect(HDC hdc, int x 1, int y 1, int x 2, int y 2, int x 3, int y 3) Рисует прямоугольник с закругленными краями, размер которого определяется координатами верхнего (x 1, y 1), нижнего (x 2, y 2) угла и координатами округления (x 3, y 3). Используя текущее перо, а для заполнения текущая кисть.
• BOOL Arc(HDC hdc, int x 1, int y 1, int x 2, int y 2, int x 3, int y 3, int x 4, int y 4) Рисует эллиптическую дугу, логически ограниченную прямоугольником, размер которого определяется координатами верхнего (x 1, y 1) и нижнего (x 2, y 2) угла. Непосредственно дуга определяется дополнительными двумя точками (x 3, y 3, x 4, y 4). Первая начало дуги - находится на пересечении эллипса, частью которого является дуга, и прямой, проходящей через центр прямоугольника и точку начала дуги. Вторая - конец дуги определяется аналогично. Дуга прорисовывается против часовой стрелки. Ограничивающий прямоугольник должен быть не длиннее и не шире 32767.
• BOOL Arc. To(HDC hdc, int x 1, int y 1, int x 2, int y 2, int x 3, int y 3, int x 4, int y 4) Полностью аналогична функции Arc, за исключением того, что запоминается текущую позицию пера как последнюю точку дуги. • BOOL Pie(HDC hdc, int x 1, int y 1, int x 2, int y 2, int x 3, int y 3, int x 4, int y 4) Рисует сектор эллипса, логически вписываемый в прямоугольник, размер которого определяется координатами верхнего (x 1, y 1) и нижнего (x 2, y 2) угла, а координаты начальной и конечной точек (x 3, y 3, x 4, y 4), аналогично функции Arc(). Ограничивающий прямоугольник должен быть не длиннее и не шире 32767. Используется текущее перо, а для заполнения текущая кисть.
• BOOL Chord(HDC hdc, int x 1, int y 1, int x 2, int y 2, int x 3, int y 3, int x 4, int y 4) Рисует сегмент эллипса (область, ограниченную пересечением эллипса и линии), логически вписываемый в прямоугольник, размер которого определяется координатами верхнего (x 1, y 1) и нижнего (x 2, y 2) угла, а координаты ограничительной линии (x 3, y 3, x 4, y 4). Используется текущее перо, а для заполнения текущая кисть. • BOOL Polyline(HDC hdc, CONST POINT *lppt, int c. Points) Функция рисует ломаную линию по массиву точек, на который указывает lppt и число точек из этого массива равно c. Points. Отрезки прямых рисуются текущим пером. Фигуры, образованные сегментами, не закрашиваются.
• BOOL Polygon(HDC hdc, CONST POINT *lppt, int c. Points) Функция рисует многоугольник, состоящий из двух или больше вершины, связанных прямыми линиями по массиву точек, на который указывает lppt и число точек из этого массива равно c. Points. Используется текущее перо и заполнение текущей кистью. • BOOL Angle. Arc(HDC hdc, int x 1, int y 1, int r, float f. Start. Angle, float f. Sweep. Angle) Рисует линию сегмента и дугу с центром радиуса дуги в точке x 1, y 1 и радиусом r (радиус круга в логических модулях, всегда положителен). f. Start. Angle - стартовый угол в градусах относительно оси X, f. Sweep. Angle определяет конечный угол в градусах относительно стартового угла. Фигура не заполнена.
• BOOL Polyline(HDC hdc, CONST POINT *lppt, CONST DWORD *lpdw. Poly. Points, DWORD c. Count) lppt - указатель на массив структур типа POINT. Каждая структура в массиве идентифицирует точку в логическом пространстве. • lpdw. Poly. Points - указывает на массив переменных, определяющих число точек в массиве lppt для соответствующей ломаной линии. Значение каждого элемента должно быть больше или равно двум. • c. Count - определяет количество элементов в массиве lpdw. Poly. Po. Отрезки прямых рисуются текущим пером. Фигуры, образованные сегментами, не закрашиваются.
• BOOL Polyline. To(HDC hdc, CONST POINT *lppt, CONST DWORD *lpdw. Poly. Points, DWORD c. Count) Полностью аналогична функции Polyline, за исключением того, что запоминается как текущая позиция пера последняя точка линии. • BOOL Polygon(HDC hdc, CONST POINT *lppt, CONST DWORD *lpdw. Poly. Points, DWORD c. Count) Параметры аналогичны параметрам функции Polyline. Функция рисует ряд замкнутых многоугольников. Каждый многоугольник рисуются текущим пером и закрашен текущей кистью. Многоугольники могут накладываться друг на друга.
• BOOL Poly. Blezier(HDC hdc, CONST POINT *lppt, DWORD c. Points) Выводит одну или более кривых Безье. Эти кривые задаются началом, концом линии и промежуточными точками, определяющими изгиб. В массиве точек первая и четвертая используются как конечные, вторая и третья как промежуточные. Для следующей линии необходимо еще три точки четвертая точка первой линии является начальной для второй. • BOOL Poly. Blezier. To(HDC hdc, CONST POINT *lppt, DWORD c. Points) Полностью аналогична функции Poly. Bezier, за исключением того, что запоминается как текущая позиция пера последняя точка линии.
• BOOL Poly. Draw(const POINT* lp. Points, const BYTE* lp. Types, int n. Count) Функция составляет множество сегментов Кривых Безье. lp. Points указатель на массив структур данных POINT, который содержит оконечные точки для каждого сегмента линии и контрольных точек для каждой кривой Безье. lp. Types - указатель на массив, который определяет, как каждая точка в lp. Points массиве используется. n. Count Определяет общее число точек в lp. Points массиве и число байт в lp. Types массиве. Функция модифицирует текущую позицию. Нарисованные замкнутые фигуры не заполняются.


