Опубликован: 13.07.2012 | Доступ: свободный | Студентов: 460 / 8 | Оценка: 5.00 / 5.00 | Длительность: 18:06:00
Специальности: Программист
Лекция 7:

Рисование на канве компонентов

< Лекция 6 || Лекция 7: 12345 || Лекция 8 >

Рисование линий

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

Рис. 7.2. Программа, рисующая многоугольник на канве компонента содержимого

Кроме того, класс 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)
Программа, рисующая пунктиром многоугольник на канве компонента содержимого

Рис. 7.3. Программа, рисующая пунктиром многоугольник на канве компонента содержимого
< Лекция 6 || Лекция 7: 12345 || Лекция 8 >