Интернет-журнал "Домашняя лаборатория", 2007 №9 - Журнал «Домашняя лаборатория»
Непосредственное рисование кистью осуществляют методы группы Fill;
graph.FillEllipse(brush,ret);
graph.FillPie(brush, ret,30f,60f);
graph.FillRectangle(brush,ret);
Первый аргумент всегда задает кисть, а остальные зависят от типа рисуемой фигуры. Как правило, всегда задается прямоугольник, ограничивающий данную фигуру.
Вызов метода DrawShapes, как уже говорилось, встроен в обработчик события Click формы RandomShapes:
private void RandomShapes_Click(object sender, System.EventArgs e)
{
DrawShapes();
}
На этом поставим точку в рассмотрении данной темы. По сути, этим завершается и наш учебный курс. В последней лекции будет рассмотрен некоторый заключительный проект.
25. Финальный проект
В этой заключительной лекции новый материал появляться не будет, не будет и традиционных вопросов в конце лекции. Лекция особенная — она посвящена описанию финального проекта, в котором объединены многие, надеюсь, уже хорошо знакомые элементы.
В финальном проекте создается семейство классов, описывающих геометрические фигуры. Проектирование начинается с абстрактного класса поведения, который описывает общие свойства и методы, характерные для всех фигур семейства. Затем, используя наследование, создаются классы конкретных геометрических фигур, начиная с простейших, таких, как круги и прямоугольники, до составных, таких, как класс Person. Мы добавим в наш проект динамические структуры данных, такие, как список с курсором, для хранения в нем фигур семейства. Наконец, мы создадим интерфейс, включающий меню с десятками команд и панель с инструментальными кнопками. Интерфейс позволяет конечному пользователю выполнять различные действия над геометрическими фигурами — создавать, рисовать их на форме, перемещать их с помощью команд и перетаскивать их мышью, менять их размеры и цвет, сохранять в списке и удалять из списка, отображать все фигуры списка или очистить его полностью.
Проект может служить образцом полноценного Windows-приложения, примером проектирования в классах с демонстрацией преимуществ, предоставляемых наследованием. Закончим на этом рекламную часть и приступим к делу. Хочу предупредить, вас ждут программные тексты, почти без всяких комментариев. Все нужные комментарии были даны в предыдущих лекциях. С моей точки зрения, наиболее интересная часть программистских книжек — это та, в которой приводится программный код. И значит, эта глава самая интересная.
Абстрактный класс Figure
Приведем код класса:
using System;
using System.Drawing;
namespace Shapes {
/// <summary>
/// Figure — это абстрактный класс; прародитель семейства
/// классов геометрических фигур. Все фигуры имеют:
/// центр — center, масштаб — scale, статус
/// перетаскивания — dragged center — объект встроенного
/// класса (структуры) Point. Этот объект задает характерную
/// точку фигуры — чаще всего ее центр (тяжести)
/// scale задает масштаб фигуры, первоначально единичный.
/// drugged = true, когда фигура следует за курсором мыши.
/// над фигурами определены операции: параллельный
/// перенос — Move(а, Ь) масштабирование — Scale(s)
/// Показ фигуры — Show. Область захвата — Region_Capture
/// возвращает прямоугольник, характерный для фигуры,
/// перетаскивание фигуры возможно при установке курсора
/// мыши в области захвата.
/// </summary>
abstract public class Figure
{
/// <summary>
/// закрытые для клиентов атрибуты класса — center, scale
/// </summary>
protected Point center;
protected double scale;
protected bool dragged;
protected Color color;
//Доступ к свойствам
public Point center_figure
{
get {return(center);}
set {center = value;}
}
public double scale_figure
{
get {return(scale);}
set {scale = value;}
}
public bool dragged figure
}
get {return(dragged);}
set {dragged = value;}
}
public Color color figure
{
get {return (color);}
set {color = value;}
}
/// <summary>
/// базовый конструктор фигур
/// </summary>
/// <param name="х">координата X характерной точки
///фигуры</param>
/// <param name="у">Координата Y характерной точки
///фигуры</param>
public Figure(int x, int y)
{
center = new Point(x,y);
scale = 1;
dragged = false;
color = Color.ForestGreen;
}
/// <summary>
/// отложенный метод
/// Параллельный перенос фигуры на (а, Ь)
/// require: true;
/// ensure: для любой точки фигуры р(х, у):
/// х = old(x) + а; у = old(у) + Ь;
/// </summary>
/// <param name="a">a — перемещение по горизонтали
/// вправо </param>
/// <param name="b">b — перемещение по вертикали
/// вниз</param>
/// Замечание: Для того, чтобы фигура при рисовании была
/// полностью видимой, координаты всех ее точек должны
/// быть в пределах области рисования,
public void Move (int a,int b)
{
center.X +=a; center.Y += b;
}
/// <summary>
/// изменяет масштаб фигуры
/// </summary>
/// <param name="s">масштаб изменяется в s раз</param>
public void Scale(double s)
{
scale*=s;
}
/// <summary>
/// рисование фигуры в окне, передающем объекты g и реп
/// </summary>
/// <param name="g"> графический объект, методы которого
/// рисуют фигуру</param>
/// <param name="pen">перо рисования</param>
public abstract void Show(Graphics g, Pen pen,
Brush brush);
public abstract System.Drawing.Rectangle Region_Capture();
}
Абстрактный класс, относящийся к этапу проектирования системы, вместе с тем является важнейшим элементом заключительного семейства классов. В этом проявляется мощь объектно-ориентированного подхода к разработке программных систем. Заметьте, на данном уровне большая часть текста представляет документацию, являющуюся неотъемлемой частью программного проекта. Документация записана в тегах <summary>, что позволяет автоматически ее извлечь и сохранить в виде XML-отчета.
Классы семейства геометрических фигур
Приведем теперь программные коды классов, являющихся потомками класса Figure.
Класс Ellipse
Вот программный код этого класса:
using System;
using System.Drawing;
namespace