Рисование на канве компонентов
Рисование линий
Для рисования линий, из одной точки в другую, в классе 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)