📚 Hub Books: Онлайн-чтение книгРазная литератураИнтернет-журнал "Домашняя лаборатория", 2007 №9 - Журнал «Домашняя лаборатория»

Интернет-журнал "Домашняя лаборатория", 2007 №9 - Журнал «Домашняя лаборатория»

Шрифт:

-
+

Интервал:

-
+
1 ... 396 397 398 399 400 401 402 403 404 ... 415
Перейти на страницу:
цвета — первый определяет цвет повторяющегося элемента, второй — цвет границы между элементами узора.

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

1 ... 396 397 398 399 400 401 402 403 404 ... 415
Перейти на страницу:

Комментарии

Обратите внимание, что комментарий должен быть не короче 20 символов. Покажите уважение к себе и другим пользователям!

Никто еще не прокомментировал. Хотите быть первым, кто выскажется?