Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
c#.doc
Скачиваний:
36
Добавлен:
03.11.2018
Размер:
3.73 Mб
Скачать

Классы элементов списка

Рассмотрим классы, описывающие элементы списков - элементы с одним и с двумя указателями:

using System;

namespace Shapes

{

/// <summary>

/// Класс Linkable(T)задает элементы списка,включающие:

/// информационное поле типа T - item

/// ссылку на элемент типа Linkable - next

/// Функции:

/// конструктор new: -> Linkable

/// запросы:

/// Get_Item: Linkable -> T

/// Get_Next: Linkable -> Linkable

/// процедуры:

/// Set_Item: Linkable*T -> Linkable

/// Set_Next: Linkable*Linkable -> Linkable

/// Роль типа T играет Figure

/// </summary>

public class Linkable

{

public Linkable()

{

item =null; next = null;

}

/// <summary>

/// закрытые атрибуты класса

/// </summary>

Figure item;

Linkable next;

/// <summary>

/// процедуры свойства для доступа к полям класса

/// </summary>

public Figure Item{

get{

return(item);

}

set{

item = value;

}

}

public Linkable Next{

get{

return(next);

}

set{

next = value;

}

}

}//class Linkable

/// <summary>

/// Класс TwoLinkable задает элементы с двумя ссылками

/// </summary>

public class TwoLinkable

{

public TwoLinkable()

{

prev = next = null;

}

/// <summary>

/// закрытые атрибуты класса

/// </summary>

TwoLinkable prev, next;

Figure item;

/// <summary>

/// процедуры свойства для доступа к полям класса

/// </summary>

public Figure Item

{

get

{

return(item);

}

set

{

item = value;

}

}

public TwoLinkable Next

{

get

{

return(next);

}

set

{

next = value;

}

}

public TwoLinkable Prev

{

get

{

return(prev);

}

set

{

prev = value;

}

}

}//class TwoLinkable

}

Организация интерфейса

Создадим теперь интерфейс, позволяющий конечному пользователю работать с объектами наших классов. Как всегда, интерфейс создавался вручную в режиме проектирования. На форме я создал меню с большим числом команд и инструментальную панель с 18 кнопками, команды которых повторяли основную команду меню. Описывать процесс создания интерфейса не буду - он подробно рассмотрен в предыдущей главе. Поскольку вся работа по созданию интерфейса транслируется в программный код формы, то просто приведу этот достаточно длинный текст почти без всяких купюр:

using System;

using System.Drawing;

using System.Collections;

using System.ComponentModel;

using System.Windows.Forms;

using System.Data;

using Shapes;

namespace Final

{

/// <summary>

/// Эта форма обеспечивает интерфейс для создания,

/// рисования, показа, перемещения, сохранения в списке

/// и выполнения других операций над объектами семейства

/// геометрических фигур. Форма имеет меню и

/// инструментальные панели.

/// </summary>

public class Form1 : System.Windows.Forms.Form

{

//fields

Graphics graphic;

Brush brush, clearBrush;

Pen pen, clearPen;

Color color;

Figure current;

TwoWayList listFigure;

private System.Windows.Forms.MainMenu mainMenu1;

private System.Windows.Forms.ImageList imageList1;

private System.Windows.Forms.ToolBar toolBar1;

private System.Windows.Forms.MenuItem menuItem1;

// аналогичные определения для других элементов меню

private System.Windows.Forms.MenuItem menuItem35;

private System.Windows.Forms.ToolBarButton

toolBarButton1;

// аналогичные определения для других командных кнопок

private System.Windows.Forms.ToolBarButton

toolBarButton18;

private System.ComponentModel.IContainer components;

public Form1()

{

InitializeComponent();

InitFields();

}

void InitFields()

{

graphic = CreateGraphics();

color = SystemColors.ControlText;

brush = new SolidBrush(color);

clearBrush = new SolidBrush(SystemColors.Control);

pen = new Pen(color);

clearPen = new Pen(SystemColors.Control);

listFigure = new Figure_List();

current = new Person(20, 50, 50);

}

/// <summary>

/// Clean up any resources being used.

/// </summary>

protected override void Dispose( bool disposing )

{

if( disposing )

{

if (components != null)

{

components.Dispose();

}

}

base.Dispose( disposing );

}

#region Windows Form Designer generated code

/// <summary>

/// Required method for Designer support - do not modify

/// the contents of this method with the code editor.

/// </summary>

private void InitializeComponent()

{

// Код, инициализирующий компоненты и построенный

// дизайнером, опущен

}

#endregion

/// <summary>

/// Точка входа в приложение - процедура Main,

/// запускающая форму

/// </summary>

[STAThread]

static void Main()

{

Application.Run(new Form1());

}

private void menuItem7_Click(object sender,

System.EventArgs e)

{

createEllipse();

}

void createEllipse()

{

//clear old figure

if (current != null) current.Show(graphic,

clearPen, clearBrush);

//create ellipse

current = new Ellipse(50, 30, 180,180);

}

private void menuItem8_Click(object sender,

System.EventArgs e)

{

createCircle();

}

void createCircle()

{

//clear old figure

if (current != null) current.Show(graphic,

clearPen, clearBrush);

//create circle

current = new Circle(30, 180,180);

}

private void menuItem9_Click(object sender,

System.EventArgs e)

{

createLittleCircle();

}

void createLittleCircle()

{

//clear old figure

if (current != null) current.Show(graphic,

clearPen, clearBrush);

//create littlecircle

current = new LittleCircle(180,180);

}

private void menuItem10_Click(object sender,

System.EventArgs e)

{

createRectangle();

}

void createRectangle()

{

//clear old figure

if (current != null) current.Show(graphic,

clearPen, clearBrush);

//create rectangle

current = new Rect(50, 30, 180,180);

}

private void menuItem11_Click(object sender,

System.EventArgs e)

{

createSquare();

}

void createSquare()

{

//clear old figure

if (current != null) current.Show(graphic,

clearPen, clearBrush);

//create square

current = new Square(30, 180,180);

}

private void menuItem12_Click(object sender,

System.EventArgs e)

{

createPerson();

}

void createPerson()

{

//clear old figure

if (current != null) current.Show(graphic,

clearPen, clearBrush);

//create person

current = new Person(20, 180,180);

}

private void menuItem13_Click(object sender,

System.EventArgs e)

{

showCurrent();

}

void showCurrent()

{

//Show current

current.Show(graphic, pen, brush);

}

private void menuItem14_Click(object sender,

System.EventArgs e)

{

clearCurrent();

}

void clearCurrent()

{

//Clear current

current.Show(graphic, clearPen, clearBrush);

}

private void menuItem17_Click(object sender,

System.EventArgs e)

{

incScale();

}

void incScale()

{

//Increase scale

current.Show(graphic, clearPen, clearBrush);

current.Scale(1.5);

current.Show(graphic, pen, brush);

}

private void menuItem18_Click(object sender,

System.EventArgs e)

{

decScale();

}

void decScale()

{

//Decrease scale

current.Show(graphic, clearPen, clearBrush);

current.Scale(2.0/3);

current.Show(graphic, pen, brush);

}

private void menuItem19_Click(object sender,

System.EventArgs e)

{

moveLeft();

}

void moveLeft()

{

//Move left

current.Show(graphic, clearPen, clearBrush);

current.Move(-20,0);

current.Show(graphic, pen, brush);

}

private void menuItem20_Click(object sender,

System.EventArgs e)

{

moveRight();

}

void moveRight()

{

//Move right

current.Show(graphic, clearPen, clearBrush);

current.Move(20,0);

current.Show(graphic, pen, brush);

}

private void menuItem21_Click(object sender,

System.EventArgs e)

{

moveTop();

}

void moveTop()

{

//Move top

current.Show(graphic, clearPen, clearBrush);

current.Move(0,-20);

current.Show(graphic, pen, brush);

}

private void menuItem22_Click(object sender,

System.EventArgs e)

{

moveDown();

}

void moveDown()

{

//Move down

current.Show(graphic, clearPen, clearBrush);

current.Move(0, 20);

current.Show(graphic, pen, brush);

}

private void menuItem23_Click(object sender,

System.EventArgs e)

{

//choose color

ColorDialog dialog = new ColorDialog();

if (dialog.ShowDialog() ==DialogResult.OK)

color =dialog.Color;

pen = new Pen(color); brush =

new SolidBrush(color);

}

private void menuItem24_Click(object sender,

System.EventArgs e)

{

//Red color

color =Color.Red;

pen = new Pen(color); brush =

new SolidBrush(color);

}

private void menuItem25_Click(object sender,

System.EventArgs e)

{

//Green color

color =Color.Green;

pen = new Pen(color); brush =

new SolidBrush(color);

}

private void menuItem26_Click(object sender,

System.EventArgs e)

{

//Blue color

color =Color.Blue;

pen = new Pen(color); brush =

new SolidBrush(color);

}

private void menuItem27_Click(object sender,

System.EventArgs e)

{

//Black color

color =Color.Black;

pen = new Pen(color); brush =

new SolidBrush(color);

}

private void menuItem28_Click(object sender,

System.EventArgs e)

{

//Gold color

color =Color.Gold;

pen = new Pen(color); brush =

new SolidBrush(color);

}

private void menuItem29_Click(object sender,

System.EventArgs e)

{

//put_left: добавление фигуры в список

listFigure.put_left(current);

}

private void menuItem30_Click(object sender,

System.EventArgs e)

{

//put_right: добавление фигуры в список

listFigure.put_right(current);

}

private void menuItem31_Click(object sender,

System.EventArgs e)

{

//remove: удаление фигуры из списка

if(!listFigure.empty())

listFigure.remove();

}

private void menuItem32_Click(object sender,

System.EventArgs e)

{

goPrev();

}

void goPrev()

{

//go_prev: передвинуть курсор влево

if(!(listFigure.Index == 1))

{

listFigure.go_prev();

current = listFigure.item();

}

}

private void menuItem33_Click(object sender,

System.EventArgs e)

{

goNext();

}

void goNext()

{

//go_next: передвинуть курсор вправо

if( !(listFigure.Index == listFigure.Count))

{

listFigure.go_next();

current = listFigure.item();

}

}

private void menuItem34_Click(object sender,

System.EventArgs e)

{

//go_first

listFigure.start();

if(!listFigure.empty())

current = listFigure.item();

}

private void menuItem35_Click(object sender,

System.EventArgs e)

{

//go_last

listFigure.finish();

if(!listFigure.empty())

current = listFigure.item();

}

private void menuItem15_Click(object sender,

System.EventArgs e)

{

showList();

}

void showList()

{

//Show List

listFigure.start();

while(listFigure.Index <= listFigure.Count)

{

current = listFigure.item();

current.Show(graphic,pen,brush);

listFigure.go_next();

}

listFigure.finish();

}

private void menuItem16_Click(object sender,

System.EventArgs e)

{

clearList();

}

void clearList()

{

//Clear List

listFigure.start();

while(!listFigure.empty())

{

current = listFigure.item();

current.Show(graphic,clearPen,clearBrush);

listFigure.remove();

}

}

private void Form1_MouseMove(object sender,

System.Windows.Forms.MouseEventArgs e)

{

if((current != null) && current.dragged_figure)

{

current.Show(graphic,clearPen,clearBrush);

Point pt = new Point(e.X, e.Y);

current.center_figure = pt;

current.Show(graphic,pen,brush);

}

}

private void Form1_MouseUp(object sender,

System.Windows.Forms.MouseEventArgs e)

{

current.dragged_figure = false;

}

private void Form1_MouseDown(object sender,

System.Windows.Forms.MouseEventArgs e)

{

Point mousePoint = new Point (e.X, e.Y);

Rectangle figureRect = current.Region_Capture();

if ((current != null) &&

(figureRect.Contains(mousePoint)))

current.dragged_figure = true;

}

protected override void

OnPaint(System.Windows.Forms.PaintEventArgs e)

{

//show current figure

current.Show(graphic, pen, brush);

}

private void toolBar1_ButtonClick(object sender,

System.Windows.Forms.ToolBarButtonClickEventArgs e)

{

int buttonNumber =

toolBar1.Buttons.IndexOf(e.Button);

switch (buttonNumber)

{

case 0:

createEllipse(); break;

case 1:

createCircle(); break;

case 2:

createLittleCircle(); break;

case 3:

createRectangle(); break;

case 4:

createSquare(); break;

case 5:

createPerson(); break;

case 6:

showCurrent(); break;

case 7:

clearCurrent(); break;

case 8:

showList(); break;

case 9:

clearList(); break;

case 10:

incScale(); break;

case 11:

decScale(); break;

case 12:

moveLeft(); break;

case 13:

moveRight(); break;

case 14:

moveTop(); break;

case 15:

moveDown(); break;

case 16:

goNext(); break;

case 17:

goPrev(); break;

}

}

}

}

Команд меню и кнопок в нашем интерфейсе много, поэтому много и обработчиков событий, что приводит к разбуханию кода. Но каждый из обработчиков событий довольно прост. Ограничусь кратким описанием главного меню:

  • команды пункта главного меню Create позволяют создавать геометрические фигуры разных классов;

  • команды пункта главного меню Show позволяют показать или стереть текущую фигуру или все фигуры, сохраняемые в списке;

  • две команды пункта Scale позволяют изменить масштаб фигуры (увеличить ее или уменьшить);

  • команды пункта Move позволяют перемещать текущую фигуру в четырех направлениях;

  • команды пункта Color позволяют либо задать цвет фигур в диалоговом окне, либо выбрать один из предопределенных цветов;

  • группа команд пункта List позволяет помещать текущую фигуру в список, перемещаться по списку и удалять из списка ту или иную фигуру;

  • командные кнопки инструментальной панели соответствуют наиболее важным командам меню;

  • реализована возможность перетаскивания фигур по экрану мышью.

В заключение взгляните, как выглядит форма в процессе работы с объектами:

Рис. 25.1.  Финальный проект. Форма в процессе работы

322