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

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

Создание заготовок для дочерних форм

Теперь давайте создадим заготовки из 15 форм, соответствующие упражнениям, рассматриваемым далее. Вначале создадим одну шаблонную форму, заполнив в ней необходимые подключаемые пространства имен. Затем будем эту форму копировать в требуемые, задавая соответствующие имена файлов и классов. Затем, после физического (permanently) удаления шаблонной формы приступим к рассмотрению и выполнению упражнений.

  • Добавьте в проект новый класс с именем Template командой Project/Add Class


  • Отредактируйте код файла Template.cs так
using System;
using System.Windows.Forms;
using System.Drawing;
  
namespace Test
{
  public class Template : Form
  {
    public Template()
    {
    }
  }
}
Листинг 16.8. Код заготовки для копирования форм
  • Сохраните изменения файла Template.cs на диске, выполнив команду File/Save All
  • В панели Solution Explorer выделите файл Template.cs, затем через меню Edit оболочки выполните команду Copy, а затем 15 раз подряд команду Paste или Ctrl-V . Таким образом мы получим 15 копий файла Template.cs
  • Выделите файл Template.cs и выполните команду Edit/Delete, чтобы удалить файл физически.
  • В панели Solution Explorer переименуйте полученные копии файлов в соответствии со следующим списком
  1. XMarksTheSpot.cs
  2. HelloPrinter.cs
  3. PrintableForm.cs
  4. BoxingTheClient.cs
  5. DrawHouse.cs
  6. SineCurve.cs
  7. PolyEllipse.cs
  8. ClientEllipse.cs
  9. Spiral.cs
  10. OutlineClientRectangle.cs
  11. DashedEllipse.cs
  12. RoundRect.cs
  13. PieChart.cs
  14. BetterPieChart.cs
  15. FillModesClassical.cs
  • Откройте каждый из только что переименованных файлов в редакторе кода и присвойте классам и их конструкторам имена соответствующих файлов, например
using System;
using System.Windows.Forms;
using System.Drawing;
  
namespace Test
{
  public class XMarksTheSpot : Form
  {
    public XMarksTheSpot()
    {
    }
  }
}
Листинг 16.9. Файл XMarksTheSpot.cs после редактирования
  • Постройте приложение и проверьте, что при щелчке на каждой строке списка создается соответствующая ей новая форма (пока еще пустая).

После таких грандиозных подготовительных операций перейдем к выполнению самих упражнений. В каждом упражнении мы будем ставить задачу и рассматривать ее решение с использованием библиотеки FCL (Framework Class Library) и средств C#.

Упражнение 1. Рисование прямых линий

Чтобы нарисовать линию, нужно определить ее толщину, цвет, стиль и другие параметры. Этим ведает класс Pen (перо), поэтому чтобы нарисовать линию, нужно прежде всего содать объект типа Pen. Перья могут быть созданы также и на основе кистей (класс Brush). В свою очередь, кисти можно создать из растровых изображений и графических контуров.

Создать простое приро можно так

Pen pen = new Pen(color);

где color - экземпляр структуры System.Drawing.Color.

Можно, также, использовать готовые статические неизменяемые свойства класса System.Drawing.Pens, каждое из которых возвращает объект Pen с толщиной линии 1. Это можно делать напрямую или через переменную, например

Pen pen = Pens.Red;

У класса System.Drawing.SystemPens 15 общих (статических, уровня класса) неизменяемых (только для чтения) свойств, которые возвращают объекты Pen на основе системных цветов. Но если нужно создать перо, гарантированно видимое на фоне, цвет которого выбрал пользователь, следует поставить цвет пера в зависимость от текущего значения свойства ForeColor элемента управления или формы, например

Pen pen = new Pen(ForeColor);


Для создания пера с нужной толщиной линии используется перегруженные конструкторы класса Pen, у которых последний параметр ожидает толщину


Объекты Pen, которые возвращают свойства классов Pens и SystemPens, имеют тольщину 1. Пока можно считать, что это пикселы. Но реально толщина выражается в глобальных координатах и подвержена влиянию преобразований. Можно создать перья, толщина которых будет всегда равна 1 пикселу, независимо от преобразований. Для этого при создании пера следует указать в конструкторе толщину 0 или установить свойство пера Width равным 0, например

Pen pen = new Pen(color, 0);
Pen pen1 = new Pen(color); 
pen1.Width = 0;

Для рисования одиночных прямых служит метод DrawLine(), а для последовательности прямых - DrawLines() класса Graphics, применяемых к объекту.


Метод DrawLine() рисует прямую от начальной точки до конечной, включая в линию сами точки. Например, вызов graphics.DrawLine(pen, 2, 2, 3, 3) рисует два пиксела между точками (2,2) и (3,3), а вызов graphics.DrawLine(pen, 3, 3, 3, 3) ничего не рисует.

Размер клиентской области формы определяется ее свойством ClientSize, где ширина ClientSize.Width и высота ClientSize.Height измеряются в пикселах, нумерация пикселов начинается с нуля.

  • Ниже приведен пример программы, рисующей крестик в клиентской области
using System;
using System.Drawing;
using System.Windows.Forms;
  
namespace Test
{
  public class XMarksTheSpot : Form
  {
    public XMarksTheSpot()
    {
      this.Text = "Крестик в клиентской области";
      this.Width += 50;
      this.Height /= 2;
      this.BackColor = System.Drawing.SystemColors.Window;
      this.ForeColor = System.Drawing.SystemColors.WindowText;
      this.ResizeRedraw = true;
    }
  
    protected override void OnPaint(PaintEventArgs e)
    {
      Graphics graphics = e.Graphics;
      Pen pen = new Pen(this.ForeColor);
      graphics.DrawLine(pen, // Перо
        0, 0, // Верхний левый угол клиентской области
        this.ClientSize.Width - 1, this.ClientSize.Height - 1);// Правый нижний
      graphics.DrawLine(pen, 
        this.ClientSize.Width - 1, 0, // Правый верхний
        0, this.ClientSize.Height - 1);// Левый нижний
  
      base.OnPaint (e);
    }
  }
}
Листинг 16.10. Код программы XMarksTheSpot.cs, рисующей крестик

Результат работы кода такой