Описание классов для рисования и работы с графическим интерфейсом AgavaSCADA/AgavaPLC
1 Обзор
Данное описание предназначено для использования с системами версии 1.6+. Ниже описываются инструменты, реализующие вывод графических примитивов, инструменты рисования и обработки событий.
2 Основные классы и структуры
2.1 Rect
Прямоугольная область с координатами и размерами.
Конструкторы:
Rect()- пустой прямоугольникRect(int x, int y, int w, int h)- с заданными параметрами
Свойства:
int x,int y- координаты верхнего левого углаint width,int height- размеры
Пример использования:
Rect rect(10, 20, 100, 50); // x=10, y=20, width=100, height=50 Rect area = Rect(0, 0, 800, 600);
2.2 Point
Точка в 2D-пространстве.
Конструкторы:
Point()- точка (0,0)Point(int x, int y)- с заданными координатами
Свойства:
int x,int y- координаты
Пример использования:
Point start(0, 0); Point end(100, 100); Point center = Point(50, 50);
2.3 Color
Цвет в формате RGBA.
Конструкторы:
Color()- черный непрозрачныйColor(int r, int g, int b, int a = 255)- с компонентами цвета
Свойства:
int r,int g,int b- цветовые компоненты (0-255)int a- альфа-канал (0-255), где 255 - полностью непрозрачный
Пример использования:
Color red(255, 0, 0); // Красный Color blue(0, 0, 255, 128); // Синий полупрозрачный Color white(255, 255, 255); // Белый
2.4 Font
Описание шрифта для текста.
Конструкторы:
Font()- шрифт по умолчаниюFont(int size, string name, bool italic = false, bool bold = false, bool underline = false, bool strikethrough = false)
Свойства:
int size- размер шрифтаstring name- название шрифтаbool italic- курсивbool bold- жирныйbool underline- подчеркнутыйbool strikethrough- зачеркнутый
Пример использования:
Font defaultFont; Font titleFont(24, "Arial", false, true); // Жирный Arial 24px Font italicFont(12, "Times New Roman", true); // Курсивный
2.5 Pen
Инструмент для рисования линий и контуров.
Конструкторы:
Pen()- перо по умолчаниюPen(int size, Color color, LineType lineType = LineType::Solid)
Свойства:
int size- толщина линииColor color- цветLineType lineType- тип линии
Перечисление LineType:
Undefined- неопределенный типSolid- сплошная линияDash- пунктирная линияDot- точечная линияDashDot- штрих-пунктирнаяDashDotDot- штрих-две точки
Пример использования:
Pen thinRed(1, Color(255, 0, 0), LineType::Solid); Pen thickBlue(3, Color(0, 0, 255), LineType::Dash); Pen dottedBlack(2, Color(0, 0, 0), LineType::Dot);
2.6 ResourceLink
Ссылка на ресурсы (изображения, звуковый файлы).
Конструкторы:
ResourceLink()- пустая ссылкаResourceLink(const string &in path)- из файлового путиResourceLink(const string &in lib, const string &in res)- из библиотеки ресурсов
Методы:
string GetFilePath() const- путь к файлуstring GetFullFilePath() const- полный путьstring GetLibraryName() const- имя библиотекиstring GetResourceName() const- имя ресурсаbool IsValid()- проверка валидностиbool IsEmpty()- проверка на пустотуLinkType GetLinkType() const- тип ссылкиstring ToString()- строковое представление
Перечисление LinkType:
Undefined- неопределенный типResource- ресурс из библиотекиFile- файл из файловой системы
Пример использования:
ResourceLink fileImage("images/background.png");
ResourceLink libImage("textures", "wood_pattern");
ResourceLink invalidLink;
if (fileImage.IsValid())
{
string path = fileImage.GetFilePath();
}
2.7 Gradient
Градиентная заливка.
Конструкторы:
Gradient()- градиент по умолчаниюGradient(GradientType type)- с указанием типа
Свойства:
GradientType type- тип градиентаPoint start,Point end- начальная и конечная точки (для линейного)Point center- центр (для радиального)float radius- радиус (для радиального)Point focal- фокальная точкаPoint centerConical- центр конического градиентаfloat angle- угол
Методы для работы с цветовыми остановками:
void AddColorStop(float position, Color color)- добавить цветовую остановкуvoid ClearColorStops()- очистить все остановкиint GetColorStopCount() const- количество остановокvoid GetColorStop(int index, float& out position, Color& out color) const- получить остановкуvoid SetColorStop(int index, float position, Color color)- установить остановку
Перечисление GradientType:
Linear- линейный градиентRadial- радиальный градиентConical- конический градиент
Пример использования:
Gradient linearGrad(GradientType::Linear); linearGrad.start = Point(0, 0); linearGrad.end = Point(100, 0); linearGrad.AddColorStop(0.0, Color(255, 0, 0)); // Красный в начале linearGrad.AddColorStop(1.0, Color(0, 0, 255)); // Синий в конце Gradient radialGrad(GradientType::Radial); radialGrad.center = Point(50, 50); radialGrad.radius = 50;
2.8 Brush
Инструмент заливки.
Конструкторы:
Brush()- кисть по умолчаниюBrush(Color color, BrushStyle style = BrushStyle::SolidPattern)- сплошной цветBrush(Gradient gradient, BrushStyle style = BrushStyle::LinearGradientPattern)- градиентBrush(ResourceLink texture, BrushStyle style = BrushStyle::TexturePattern)- текстура
Свойства:
BrushStyle style- стиль кистиColor color- цвет (для SolidPattern)Gradient gradient- градиентResourceLink texture- текстура
Перечисление BrushStyle:
- Сплошные и пустые:
NoBrush,SolidPattern - Плотность заливки:
Dense1Pattern-Dense7Pattern(от самой плотной до самой редкой) - Линейные паттерны:
HorPattern(горизонтальные линии),VerPattern(вертикальные линии),CrossPattern(сетка) - Диагональные паттерны:
BDiagPattern,FDiagPattern,DiagCrossPattern - Специальные:
LinearGradientPattern,RadialGradientPattern,ConicalGradientPattern,TexturePattern
Пример использования:
Brush solidRed(Color(255, 0, 0)); Brush gradientBrush(linearGrad); // Градиентная кисть Brush textureBrush(textureLink, BrushStyle::TexturePattern); Brush patternBrush(Color(0, 0, 0), BrushStyle::CrossPattern); // Сетка
2.9 Alignment
Флаги выравнивания текста.
Значения:
- Горизонтальное:
AlignLeft,AlignRight,AlignHCenter,AlignJustify,AlignAbsolute - Вертикальное:
AlignTop,AlignBottom,AlignVCenter,AlignBaseline - Комбинированные:
AlignCenter(центр по горизонтали и вертикали)
Пример использования:
Alignment leftTop = Alignment::AlignLeft | Alignment::AlignTop; Alignment center = Alignment::AlignCenter; Alignment rightBottom = Alignment::AlignRight | Alignment::AlignBottom;
3 Класс Painter
Основной класс для рисования, предоставляющий широкий набор графических операций.
3.1 Методы рисования фигур
Дуги и секторы
DrawArc(const Rect &in, int startAngle, int spanAngle)- дуга в прямоугольникеDrawArc(int x, int y, int w, int h, int startAngle, int spanAngle)- дуга с координатамиDrawChord()- хорда (замкнутая дуга)DrawPie()- сектор круга
Пример:
painter.DrawArc(Rect(10, 10, 100, 100), 45, 90); // Дуга от 45 до 135 градусов painter.DrawPie(50, 50, 80, 80, 0, 90); // Сектор 90 градусов
Эллипсы и окружности
DrawEllipse(const Rect &in)- эллипс в прямоугольникеDrawEllipse(int x, int y, int w, int h)- эллипс с координатамиDrawEllipse(const Point &in center, int rx, int ry)- эллипс из центра
Пример:
painter.DrawEllipse(Rect(0, 0, 200, 100)); // Эллипс painter.DrawEllipse(Point(100, 100), 50, 50); // Окружность
Линии и точки
DrawLine(int x1, int y1, int x2, int y2)- линия между точкамиDrawLine(const Point &in start, const Point &in end)- линия между точкамиDrawPoint(const Point &in)- точкаDrawPoint(int x, int y)- точка с координатами
Пример:
painter.DrawLine(0, 0, 100, 100); // Диагональная линия painter.DrawLine(Point(10, 10), Point(50, 50)); // Линия между точками painter.DrawPoint(25, 25); // Точка
Прямоугольники
DrawRect(const Rect &in)- прямоугольникDrawRect(int x, int y, int w, int h)- прямоугольник с координатамиDrawRoundedRect(const Rect &in, double xRadius, double yRadius)- скругленный прямоугольникDrawRoundedRect(int x, int y, int w, int h, double xRadius, double yRadius)- скругленный с координатами
Пример:
painter.DrawRect(Rect(10, 10, 100, 50)); // Прямоугольник painter.DrawRoundedRect(20, 20, 80, 40, 10, 10); // Скругленный прямоугольник
Изображения
DrawImage(const Rect &in target, const ResourceLink &in image, const Rect &in source)- изображение с областьюDrawImage(const Point &in pos, const ResourceLink &in image, const Rect &in source)- изображение в позиции с областьюDrawImage(const Rect &in target, const ResourceLink &in image)- изображение в прямоугольникDrawImage(const Point &in pos, const ResourceLink &in image)- изображение в позиции
Пример:
ResourceLink img("images/icon.png");
painter.DrawImage(Point(0, 0), img); // Рисуем в позиции (0,0)
painter.DrawImage(Rect(10, 10, 32, 32), img); // Масштабируем в прямоугольник
painter.DrawImage(Rect(0, 0, 64, 64), img, Rect(0, 0, 32, 32)); // Часть изображения
Текст
DrawText(const Point &in pos, const string &in text)- текст в позицииDrawText(int x, int y, const string &in text)- текст с координатамиDrawText(const Rect &in rect, int alignment, const string &in text)- текст в прямоугольнике с выравниваниемDrawText(int x, int y, int w, int h, int alignment, const string &in text)- текст в области с выравниванием
Пример:
painter.DrawText(Point(10, 10), "Hello World"); // Простой текст painter.DrawText(Rect(0, 0, 200, 50), Alignment::AlignCenter, "Centered Text"); // Выровненный текст
3.2 Методы заливки и очистки
EraseRect(const Rect &in)- очистить прямоугольную областьEraseRect(int x, int y, int w, int h)- очистить область с координатамиFillRect(const Rect &in, const Brush &in)- залить прямоугольник кистьюFillRect(int x, int y, int w, int h, const Brush &in)- залить область кистьюFillRect(const Rect &in, const Color &in)- залить прямоугольник цветомFillRect(int x, int y, int w, int h, const Color &in)- залить область цветом
Пример:
painter.FillRect(Rect(0, 0, 100, 100), Color(255, 0, 0)); // Красный прямоугольник painter.FillRect(10, 10, 50, 50, gradientBrush); // Градиентная заливка painter.EraseRect(5, 5, 10, 10); // Очистить область
3.3 Управление состоянием
Геттеры и сеттеры стилей
Brush GetBackground(),void SetBackground(const Brush &in)- фонBrush GetBrush(),void SetBrush(const Brush &in)- кисть заливкиPoint GetBrushOrigin(),void SetBrushOrigin(const Point &in)- начало координат кистиFont GetFont(),void SetFont(const Font &in)- шрифт текстаPen GetPen(),void SetPen(const Pen &in)- перо для линий
Пример:
// Установка стилей painter.SetPen(Pen(2, Color(0, 0, 0))); painter.SetBrush(Brush(Color(255, 255, 0))); painter.SetFont(Font(12, "Arial", false, true)); // Получение текущих стилей Pen currentPen = painter.GetPen(); Brush currentBrush = painter.GetBrush();
3.4 Трансформации и clipping
Трансформации
void ResetTransform()- сброс всех трансформацийvoid Rotate(double angle)- поворот на угол (в градусах)void Scale(double sx, double sy)- масштабированиеvoid Shear(double sh, double sv)- наклон/скосvoid Translate(const Point &in)- смещениеvoid Save(),void Restore()- сохранение/восстановление состояния
Clipping (область отсечения)
bool HasClipping()- проверка наличия области отсеченияvoid SetClipRect(const Rect &in, int operation = 1)- установка прямоугольной области отсеченияvoid SetClipRect(int x, int y, int w, int h, int operation = 1)- установка области с координатамиvoid SetClipping(bool enable)- включить/выключить отсечение
Пример:
// Трансформации painter.Save(); // Сохраняем состояние painter.Translate(Point(100, 100)); // Смещаем начало координат painter.Rotate(45); // Поворачиваем на 45 градусов painter.Scale(1.5, 1.0); // Масштабируем // Рисуем трансформированные объекты painter.Restore(); // Восстанавливаем состояние // Clipping painter.SetClipRect(Rect(50, 50, 100, 100)); // Устанавливаем область отсечения // Все рисование будет обрезано по этой области
3.5 Вспомогательные методы
bool HasClipping()- проверка наличия clippingint GetLayoutDirection(),void SetLayoutDirection(int)- направление layout (LTR/RTL)double GetOpacity(),void SetOpacity(double)- прозрачность (0.0-1.0)Rect GetBoundingRect(const Rect &in, int alignment, const string &in text)- вычисление ограничивающего прямоугольника для текстаRect GetBoundingRect(int x, int y, int w, int h, int alignment, const string &in text)- вычисление с координатами
Пример:
// Вычисление размера текста Rect textBounds = painter.GetBoundingRect(Rect(0, 0, 0, 0), Alignment::AlignLeft, "Sample Text"); int textWidth = textBounds.width; int textHeight = textBounds.height; // Установка прозрачности painter.SetOpacity(0.5); // Полупрозрачное рисование
3.6 Полный пример использования Painter
// Создание инструментов Pen borderPen(2, Color(0, 0, 0), LineType::Solid); Brush fillBrush(Color(255, 255, 0)); Font textFont(14, "Arial", false, true); // Настройка painter painter.SetPen(borderPen); painter.SetBrush(fillBrush); painter.SetFont(textFont); // Рисование painter.DrawRect(Rect(10, 10, 100, 50)); // Прямоугольник painter.DrawEllipse(Point(150, 35), 25, 15); // Эллипс painter.DrawLine(Point(200, 10), Point(250, 60)); // Линия painter.DrawText(Point(15, 15), "Hello World"); // Текст // Градиентная заливка Gradient grad(GradientType::Linear); grad.start = Point(0, 0); grad.end = Point(100, 0); grad.AddColorStop(0.0, Color(255, 0, 0)); grad.AddColorStop(1.0, Color(0, 0, 255)); Brush gradBrush(grad); painter.SetBrush(gradBrush); painter.FillRect(Rect(300, 10, 100, 50), gradBrush);
4 Обработка событий
4.1 MouseEvent
Событие мыши.
Методы:
MouseButton button() const- нажатая кнопкаPoint pos() const- позиция курсораint x() const- координата Xint y() const- координата Y
Перечисление MouseButton:
NoButton- нет нажатой кнопкиLeftButton- левая кнопка мышиRightButton- правая кнопка мышиMiddleButton- средняя кнопка мыши
Пример использования:
void OnMouseClick(MouseEvent@ event)
{
if (event.button() == MouseButton::LeftButton)
{
Point clickPos = event.pos();
int x = event.x();
int y = event.y();
}
}
4.2 WheelEvent
Событие колесика мыши.
Методы:
int angleDelta() const- угол поворота колесика (положительный - вверх, отрицательный - вниз)
Пример использования:
void OnWheel(WheelEvent@ event)
{
int delta = event.angleDelta();
if (delta > 0)
{
// Прокрутка вверх
}
else
{
// Прокрутка вниз
}
}