Опубликован: 13.07.2010 | Доступ: свободный | Студентов: 891 / 20 | Оценка: 4.40 / 4.20 | Длительность: 77:34:00
Самостоятельная работа 16:

Рисование графических примитивов средствами GDI+

Упражнение 11. Рисование дуг

Дуга - это сегмент эллипса. Чтобы определить дугу, нужно задать координаты эллипса, плюс угол для начальной и угловую длину дуги. Для рисования дуг используется четыре перегруженных метода DrawArc() класса Graphics


Два последних аргумента задают углы в градусах. Предпоследний аргумент определяет начало дуги, последний - угловую длину. Начало отсчета углов находится в точке пересечения горизонтальной линии, проходящей через центр эллипса, с правой половиной эллипса. Углы против часовой стрелки от точки отсчета считаются отрицательными, по часовой стрелке - положительными


Приведем код, рисующий эллипс с пунктирным контуром толщиной 30 пикселов. Угловой размер штрихов пунктира равен 10o, а промежутков между штрихами 15o - 10o = 5o

using System;
using System.Drawing;
using System.Windows.Forms;
  
namespace Test
{
  public class DashedEllipse : PrintableForm
  {
    public DashedEllipse()
    {
      this.Text = "Рисование эллипса функцией DrawArc()";
    }
  
    // Перегруженная функция базового класса PrintableForm
    protected override void DoPage(Graphics graphics, Color color, int cx, int cy)
    {
      int width = 30;
      Rectangle rect = new Rectangle(width / 2, width / 2, 
           cx - 1 - width, cy - 1 - width);
      Pen pen = new Pen(Color.Red, width);
      for(int iAngle = 0; iAngle < 360; iAngle += 15)
        graphics.DrawArc(pen, rect, iAngle, 10);
    }
  }
}
Листинг 16.20. Рисование эллипса штрихом с помощью функции DrawArc() (DashedEllipse.cs)

Выходной экран имеет вид


Упражнение 12. Рисование прямоугольника с закругленными углами

В Win32 API есть функция RoundRect(), рисующая прямоугольник с закругленными углами. Эта функция принимает 4 аргумента, указывающих координаты левого верхнего и правого нижнего углов прямоугольника, плюс еще два, определяющие ширину и высоту эллипса, используемого для скругления углов прямоугольника. В классе Graphics BCL такой функции нет, но ее можно вполне имитировать, используя другие функции, вот каким кодом

using System;
using System.Drawing;
using System.Windows.Forms;
  
namespace Test
{
  public class RoundRect : PrintableForm
  {
    public RoundRect()
    {
      this.Text = "Рисование прямоугольника со скругленными углами (RoundRect)";
    }
  
    // Перегруженная функция базового класса PrintableForm
    protected override void DoPage(Graphics graphics, Color color, int cx, int cy)
    {
      RoundedRectangle(graphics, Pens.Red,
        new Rectangle(0, 0, cx - 1, cy - 1),
        new Size(cx / 5, cy / 5));
    }
  
    private void RoundedRectangle(Graphics gr, Pen pn, Rectangle rect, Size sz)
    {
      gr.DrawLine(pn, rect.Left + sz.Width / 2, rect.Top,
        rect.Right - sz.Width / 2, rect.Top);
      gr.DrawArc(pn, rect.Right - sz.Width, rect.Top,
        sz.Width, sz.Height, 270, 90);
      gr.DrawLine(pn, rect.Right, rect.Top + sz.Height / 2,
        rect.Right, rect.Bottom - sz.Height / 2);
      gr.DrawArc(pn, rect.Right - sz.Width, rect.Bottom - sz.Height,
        sz.Width, sz.Height, 0, 90);
      gr.DrawLine(pn, rect.Right - sz.Width / 2, rect.Bottom,
        rect.Left + sz.Width / 2, rect.Bottom);
      gr.DrawArc(pn, rect.Left, rect.Bottom - sz.Height,
        sz.Width, sz.Height, 90, 90);
      gr.DrawLine(pn, rect.Left, rect.Bottom - sz.Height / 2,
        rect.Left, rect.Top + sz.Height / 2);
      gr.DrawArc(pn, rect.Left, rect.Top,
        sz.Width, sz.Height, 180, 90);
    }
  }
}
Листинг 16.21. Рисование прямоугольника со скругленными углами (RoundRect.cs)

Вывод на экран будет таким


Нарисованная фигура состоит из восьми частей, нарисованных отдельно. Это значит, у каждой из восьми частей контура фигуры будут прорисованы концы, а соединения между ними нет, поэтому для толстых линий не будет согласованности в местах сочленения. Правильный путь объединения прямых и кривых в цельную фигуру состоит в использовании графического контура. Как это делается, будет показано в главе 15.