Новость из категории: Информация

Графика в Ultimate++ и общие выводы

Содержание:
1. Графика (Вы читаете данный раздел);
2. Растровые изображения;
3. Другие возможности U++;
4. Выводы.
Графика в Ultimate++ и общие выводы

Как и любой другой развитый тулкит, U++ предоставляет богатый выбор средств для работы с графикой. Любые операции рисования в U++ выполняются с использованием объектов Draw, которые представляют собой абстрактный холст (canvas). Все объекты Draw подразделяются на растровые (например, ImageDraw или ViewDraw) и векторные (WinMetaFileDraw, PdfDraw и т.п.). Объекты обоих типов имеют методы для рисования как векторных примитивов (скажем, линий или полигонов), так и растровых изображений. Однако растровые объекты непосредственно устанавливают цвета пикселов холста при вызове каждой команды рисования, а векторные - «запоминают» эти вызовы в виде внутренней объектной иерархии. Разница примерно та же, что между рисунками в форматах png и svg.

Важной особенностью холста в U++ является то, что он не имеет состояний (stateless canvas). В отличие от других тулкитов, цвет линий и текста не задается глобально для всех последующих рисуемых объектов, а передается для каждого из них отдельно.

Графические примитивы и текст

Самый простой способ ознакомиться с возможностями объектов Draw - это нарисовать что-то непосредственно в клиентской области виджета. Все виджеты в U++ имеют метод Paint, который можно переопределить в унаследованном классе. Создадим в ThelDE новый проект на основе шаблона «Basic Ctrl Lib Application** и унаследуем новый класс от класса TopWindow:
#include using namespace Upp;
struct MyWindow: TopWindow {
virtual void Paint(Draw& w) {
w.DrawRect(GetSize(), White()); w.DrawRect(10, 10, 60, 80, Green());
}
};
GUI _APP_ MAIN { MyWindow w;
w.Sizeable().Title("Пример рисования в U++");
w.SetRect(0,0,300,200);
w.Run();
}

Перед тем, как разбирать этот пример, убедимся, что он компилируется без ошибок. В Ubuntu 10.10 (а возможно, и в других системах) возникает досадная ошибка «gdk-pixbuf/gdk-pixbuf.h: No such file or directory» хотя библиотека libgdk-pixbuf2.0-dev установлена. Проблема устраняется копированием заголовков в нужное место:
sudo cp -r /usr/include/gdk-pixbuf-2.0/gdk-pixbuf J /usr/include/gtk-2.0

Вернемся к примеру. Метод Paint принимает ссылку на объект Draw, на котором и будет осуществляться рисование. Имена методов рисования и их параметры в основном интуитивно понятны. В нашем случае вся область рисования заполняется белым цветом и на ней рисуется зеленый прямоугольник. Система координат начинается в левом верхнем углу, а ось Y направлена вниз. При рисовании полигонов и ломаных используются массивы точек, передаваемые в виде Vector:
Vector p;
p << Point(130, 110) << Point(160, 180) << Point(110, 150)
<< Point(170, 120) << Point(130, 110);
w.DrawPolygon(p, Blue);

Предопределенные цвета можно задавать как в виде вызова статических функций (Green()), так и в виде констант с тем же именем (Green).

Для всех геометрических примитивов, для которых это имеет смысл, можно передавать ширину и цвет линий в двух дополнительных параметрах:
// Голубой фон и пурпурные линии w.DrawPolygon(p, Cyan, 5, Magenta);

Для вывода теста предназначен метод DrawText, который позволяет использовать любой из установленных в системе шрифтов в любом начертании и с произвольным поворотом:
w.DrawText(120, 10, "Hello world!");
w.DrawText(170, 80, "Hello world!", Roman(15).Italic(), Red);
w.DrawText(180, 140, 260, "Hello world!", Courier(15).Underline());

Первые два параметра задают левый верхний угол строки, третий необязательный целочисленный параметр - поворот текста против часовой стрелки. Далее следует сама строка шрифт, которым она отображается, и цвет символов. Поворот задается с шагом в десятую долю градуса, так что полный поворот на 360° соответствует значению 3600 (почему нельзя передать произвольный поворот в виде числа с плавающей точкой - непонятно).

Вместо того чтобы вручную вычислять координаты рисуемых примитивов, можно смещать начало координат глобально методом Offset. Если нужно ограничить рисуемые объекты не границей виджета, а заданным прямоугольником, то используется метод Clip. Имеется и комбинация этих методов - Clipoff. Смещения и ограничения вычисляются относительно их предыдущих значений и запоминаются во внутреннем стеке объекта Draw. Их можно последовательно отменять, выталкивая из стека методом End:
w.Offset(10,10); // Сместить на 10,10
w.DrawText(120, 10, "Смещенный текст");
w.Clipoff(20,20,153,40); // Сместить еще на 20,20 и обрезать
w.DrawText(120, 10, "Обрезанный текст");
w.End(); // Отменить ограничение
w.End(); // Отменить первое смещение

Графика в Ultimate++ и общие выводы

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



Создали отличный информационный ресурс по U++ и теперь Вас интересует раскрутка сайта в поиске (http://1-mecto.ru/)? В таком случае, я настоятельно советую Вам найти опытных специалистов в данной области. На их роль, по моему мнению, идеально подойдут сотрудники сайта 1-mecto.ru!

Рейтинг статьи

Оценка
0/5
голосов: 0
Ваша оценка статье по пятибальной шкале:
 
 
   

Поделиться

Похожие новости

Комментарии

^ Наверх