Рисование на канве компонентов
Рисование линий
Для рисования линий, из одной точки в другую, в классе Graphics реализованы методы void Graphics::drawLine(float startX, float startY, float endX, float endY) const и void Graphics::drawLine(float startX, float startY, float endX, float endY, float lineThickness) const. Отличие между методами в том, что первый рисует текущим цветом линию между точками с координатами startX, startY и endX, endY толщиной в 1 пиксель, а во втором толщину линии можно задать параметром lineThickness. Кроме того, в классе Graphics имеются функции с тем же названием, в которые в качестве параметра можно передавать объекты класса Line, включающие информацию о собственно линии и ряд методов для решения геометрических задач.
С помощью последовательного вызова методов drawLine можно нарисовать любой многоугольник ( пример 7.2, рис. 7.2).
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);
}
for(int i = 0; i < iPointsNumber; ++i)
{
if(i != 7)
{
// Рисуем линию толщиной 3 пикселя
Canvas.drawLine(fXs[i], fYs[i], fXs[i + 1], fYs[i + 1], 3.0f);
}
else
{
// Завершаем многоугольник
Canvas.drawLine(fXs[7], fYs[7], fXs[0], fYs[0], 3.0f);
}
}
}
Листинг
7.2.
Пример рисования линий на канве компонента (файл TCentralComponent.cpp)
Кроме того, класс Graphics включает метод void Graphics::drawDashedLine(float startX, float startY, float endX, float endY, const float* dashLengths, int numDashLengths, float lineThickness = 1.0f) const, который рисует пунктирную линию по заданным характеристикам. Параметр dashLengths — массив чисел с плавающей точкой, которые содержат информацию о длинах рисуемых отрезках линии и разделяющих пробелов. Например, если в качестве параметра в функцию drawDashedLine будет передан массив {4, 5, 6, 7}, то будет нарисована линия с отрезком в 4 пикселя, пробелом в 5 пикселей, отрезком в 6 пикселей и пробелом в 7 пикселей. Пример использования метода приведён в листинге 7.3; внешний вид работающей программы показан на рисунке 7.3 .
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(fXs[i], fYs[i], fXs[i + 1], fYs[i + 1],
fDashLengths, 2, 3.0f);
}
else
{
// Завершаем многоугольник
Canvas.drawDashedLine(fXs[7], fYs[7], fXs[0], fYs[0],
fDashLengths, 2, 3.0f);
}
}
}
Листинг
7.3.
Пример рисования пунктирных линий на канве компонента (файл TCentralComponent.cpp)

