Рисование на канве компонентов
Вывод текста на канву компонента
В следующей лекции будут рассмотрены специализированные компоненты библиотеки Juce для отображения и ввода текстовой информации. Но помимо этих компонентов отображать текст можно на поверхности любого компонента в виде графики, переопределяя его метод paint.
Так же, как и при рисовании графических примитивов, цвет текста задаётся методом void Graphics::setColour(const Colour& newColour).
Вывод текста на канву осуществляют два метода:
- void Graphics::drawSingleLineText(const String& text, int startX, int baselineY) const — выводит текст text, расположенный в одну строку, начиная с позиции с координатами startX, baselineY;
- void Graphics::drawMultiLineText(const String& text, int startX, int baselineY, int maximumLineWidth) const — выводит текст text, расположенный в несколько строк, начиная с позиции с координатами startX, baselineY. Параметр maximumLineWidth задаёт максимальную ширину строки в пикселях; часть текста, ширина которой превышает эту величину, переносится на следующую строку.
Надписи в обоих методах делаются в соответствии с текущими установками шрифта компонента. Для задания шрифта текста используются методы класса Graphics:
- void Graphics::setFont(const Font& newFont) — принимает в качестве параметра новый объект класса шрифта Font;
- void Graphics::setFont(float newFontHeight, int fontStyleFlags = Font::plain) — задаёт новые размер и стиль текущего шрифта; гарнитура при этом остаётся неизменной.
Пример вывода текста на канву компонента содержимого этими методами представлен в листинге 7.8.
void TCentralComponent::paint(Graphics& Canvas)
{
// Фон виджета - белый
Canvas.fillAll(Colours::white);
// Цвет выводимого текста - чёрный
Canvas.setColour(Colours::black);
Canvas.drawSingleLineText(tr("Однострочный текст выведен
на позицию (10, 30)"), 10, 30);
// Цвет выводимого текста - синий
Canvas.setColour(Colours::blue);
Canvas.setFont(Font(25.0000f, Font::bold));
Canvas.drawMultiLineText(tr("Многострочный текст выведен
на позицию (10, 80).
\n\n\t\t\t\t\t\t\t\t\tПРИВЕТ, МИР!"),
10, 80, 550);
}
Листинг
7.8.
Пример рисования сектора, залитого линейным градиентом, на канве компонента
Внешний вид работающей программы представлен на рисунке 7.8 .
Особенности Juce 2.0
По сравнению с версией 1.53 метод Graphics::drawDashedLine во второй версии Juce претерпел изменения: теперь в качестве параметров принимаются не числа — координаты начала и конца пунктирной линии, а объект класса Line, предназначенного как раз-таки для хранения информации о линиях:
void Graphics::drawDashedLine(
const Line< float >& line,
const float* dashLengths,
int numDashLengths,
float lineThickness = 1.0f, int
dashIndexToStartFrom = 0) const
Один из конструкторов класса Line принимает в качестве параметров значения координат начала и конца линии: Line<ValueType>::Line(ValueType startX, ValueType startY, ValueType endX, ValueType endY).
Понятно, что пример из листинга 7.3 легко переделать для версии 2.0 Juce ( пример 7.9)
void TCentralComponent::paint(Graphics& Canvas)
{
// Фон виджета - белый
Canvas.fillAll(Colours::white);
// Цвет рисуемых линий - чёрный
Canvas.setColour(Colours::black);
int iPointsNumber = 8;
// Массивы для хранения координат точек,
// через которые будут проходить линии
Array<float> fXs;
Array<float> fYs;
// Вычисляем координаты точек
for(int i = 0; i < iPointsNumber; ++i)
{
float fAngle = 2 * float_Pi * i / iPointsNumber;
int iX = 50 + cos(fAngle) * 40;
int iY = 50 + sin(fAngle) * 40;
// и сохраняем их в массивах
fXs.add((float)iX);
fYs.add((float)iY);
}
// Отрезок линии - 8 пикселей,
// пробел - 4 пикселя
float fDashLengths[] = {8, 4};
for(int i = 0; i < iPointsNumber; ++i)
{
if(i != 7)
{
// Рисуем линию толщиной 3 пикселя
Canvas.drawDashedLine(
Line<float>(fXs[i], fYs[i], fXs[i + 1], fYs[i + 1]),
fDashLengths, 2, 3.0f);
}
else
{
// Завершаем многоугольник
Canvas.drawDashedLine(
Line<float>(fXs[7], fYs[7], fXs[0], fYs[0]),
fDashLengths, 2, 3.0f);
}
}
}
Листинг
7.9.
Пример рисования пунктирных линий на канве компонента (файл TCentralComponent.cpp)
Краткие итоги
Для рисования чего бы то ни было на канве компонентов в Juce используется метод paint класса Graphics, который включает ряд методов для изображения графических примитивов и произвольных фигур.
Упражнение
Создайте программу с одним главным окном белого цвета с неизменяемыми размерами. С помощью методов класса Graphics нарисуйте на канве компонента содержимого российский флаг.
Дополнительные материалы
Архив с исходными текстами примеров Вы можете скачать
здесь
