Организация интерфейса
Создадим теперь интерфейс, позволяющий конечному пользователю работать с объектами наших классов. Как всегда, интерфейс создавался вручную в режиме проектирования. На форме я создал меню с большим числом команд и инструментальную панель с 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. Финальный проект. Форма в процессе работы
- Visual Studio .Net - открытая среда разработки
- Открытость
- Framework .Net - единый каркас среды разработки
- Библиотека классов fcl - статический компонент каркаса
- Единство каркаса
- Встроенные примитивные типы
- Структурные типы
- Архитектура приложений
- Модульность
- Общеязыковая исполнительная среда clr - динамический компонент каркаса
- Двухэтапная компиляция. Управляемый модуль и управляемый код
- Виртуальная машина
- Дизассемблер и ассемблер
- Метаданные
- Сборщик мусора - Garbage Collector - и управление памятью
- Исключительные ситуации
- События
- Общие спецификации и совместимые модули
- Создание c#
- Виды проектов
- Консольный проект
- Windows-проект
- Начало начал - точка "большого взрыва"
- Выполнение проекта по умолчанию после "большого взрыва"
- Проект WindowsHello
- На этом мы закончим первое знакомство с проектaми на c# и в последующих лекциях приступим к сОбщий взгляд
- Система типов
- Типы или классы? и типы, и классы
- Семантика присваивания
- Преобразование к типу object
- Примеры преобразований
- Семантика присваивания. Преобразования между ссылочными и значимыми типами
- Операции "упаковать" и "распаковать" (boxing и unboxing).
- Где, как и когда выполняются преобразования типов?
- Преобразования ссылочных типов
- Преобразования типов в выражениях
- Преобразования внутри арифметического типа
- Явные преобразования
- Преобразования строкового типа
- Преобразования и класс Convert
- Проверяемые преобразования
- Исключения и охраняемые блоки. Первое знакомство
- Опасные вычисления в охраняемых проверяемых блоках
- Опасные вычисления в охраняемых непроверяемых блоках
- Опасные преобразования и методы класса Convert
- Объявление переменных
- Проект Variables
- Синтаксис объявления
- Время жизни и область видимости переменных
- Глобальные переменные уровня модуля. Существуют ли они в c#?
- Локальные переменные
- Глобальные переменные уровня процедуры. Существуют ли?
- Константы
- Выражения
- Приоритет и порядок выполнения операций
- Перегрузка операций
- С чего начинается выполнение выражения
- Операции "увеличить" и "уменьшить" (increment, decrement)
- Операции sizeof и typeof
- Как получить подробную информацию о классе?
- Статические поля и методы арифметических классов
- Операция new
- Арифметические операции
- Операции отношения
- Операции проверки типов
- Операции сдвига
- Логические операции
- Условное выражение
- Операция приведения к типу
- В данном примере явное преобразование из типа double в тип int выполняется, а преобразованиПрисваивание
- Специальные случаи присваивания
- Определенное присваивание
- Еще раз о семантике присваивания
- Рассмотрим объявления:
- Класс Math и его функции
- Класс Random и его функции
- Операторы языка c#
- Оператор присваивания
- Блок или составной оператор
- Пустой оператор
- Операторы выбора
- Оператор if
- Оператор switch
- Операторы перехода
- Оператор goto
- Операторы break и continue
- Оператор return
- Операторы цикла
- Оператор for
- Циклы While
- Цикл foreach
- Процедуры и функции - функциональные модули
- Процедуры и функции - методы класса
- Процедуры и функции. Отличия
- Описание методов (процедур и функций). Синтаксис
- Список формальных аргументов
- Тело метода
- Вызов метода. Синтаксис
- О соответствии списков формальных и фактических аргументов
- Вызов метода. Семантика
- Что нужно знать о методах?
- Почему у методов мало аргументов?
- Поля класса или функции без аргументов?
- Пример: две версии класса Account
- Функции с побочным эффектом
- Методы. Перегрузка
- Корректность методов
- Инварианты и варианты цикла
- Рекурсия
- Рекурсивное решение задачи "Ханойские башни"
- Быстрая сортировка Хоара
- Общий взгляд
- Объявление массивов
- Объявление одномерных массивов
- Динамические массивы
- Многомерные массивы
- Массивы массивов
- Процедуры и массивы
- Класс Array
- Массивы как коллекции
- Сортировка и поиск. Статические методы класса Array
- Сводка свойств и методов класса Array
- Класс Object и массивы
- Массивы объектов
- Массивы. Семантика присваивания
- Общий взгляд
- Строки с#
- Класс char
- Класс char[] - массив символов
- Существует ли в c# тип char*
- Пространство имен RegularExpression и классы регулярных выражений
- Немного теории
- Синтаксис регулярных выражений
- Знакомство с классами пространства RegularExpressions
- Класс Regex
- Классы Match и MatchCollection
- Классы Group и GroupCollection
- Классы Capture и CaptureCollection
- Перечисление RegexOptions
- Класс RegexCompilationInfo
- Примеры работы с регулярными выражениями
- Пример "чет и нечет"
- Пример "око и рококо"
- Пример "кок и кук"
- Пример "обратные ссылки"
- Пример "Дом Джека"
- Пример "Атрибуты"
- Классы и ооп
- Две роли классов
- Синтаксис класса
- Поля класса
- Доступ к полям
- Методы класса
- Доступ к методам
- Методы-свойства
- Индексаторы
- Операции
- Статические поля и методы класса
- Константы
- Конструкторы класса
- Деструкторы класса
- Проектирование класса Rational
- Свойства класса Rational
- Конструкторы класса Rational
- Методы класса Rational
- Закрытый метод нод
- Печать рациональных чисел
- Тестирование создания рациональных чисел
- Операции над рациональными числами
- Константы класса Rational
- Развернутые и ссылочные типы
- Классы и структуры
- Структуры
- Синтаксис структур
- Класс Rational или структура Rational
- Встроенные структуры
- Еще раз о двух семантиках присваивания
- Перечисления
- Персоны и профессии
- Отношения между классами
- Отношения "является" и "имеет"
- Отношение вложенности
- Расширение определения клиента класса
- Отношения между клиентами и поставщиками
- Сам себе клиент
- Наследование
- Добавление полей потомком
- Конструкторы родителей и потомков
- Добавление методов и изменение методов родителя
- Статический контроль типов и динамическое связывание
- Три механизма, обеспечивающие полиморфизм
- Пример работы с полиморфным семейством классов
- Абстрактные классы
- Классы без потомков
- Интерфейсы
- Две стратегии реализации интерфейса
- Преобразование к классу интерфейса
- Проблемы множественного наследования
- Коллизия имен
- Наследование от общего предка
- Встроенные интерфейсы
- Упорядоченность объектов и интерфейс iComparable
- Клонирование и интерфейс iCloneable
- Сериализация объектов
- Класс с атрибутом сериализации
- Интерфейс iSerializable
- Как определяется функциональный тип и как появляются его экземпляры
- Функции высших порядков
- Вычисление интеграла
- Построение программных систем методом "раскрутки". Функции обратного вызова
- Наследование и полиморфизм - альтернатива обратному вызову
- Делегаты как свойства
- Операции над делегатами. Класс Delegate
- Пример "Комбинирование делегатов"
- Пример "Плохая служба"
- Классы с событиями
- Класс sender. Как объявляются события?
- Делегаты и события
- Как зажигаются события
- Классы receiver. Как обрабатываются события
- Классы с событиями, допустимые в каркасе .Net Framework
- Пример "Списки с событиями"
- Класс sender
- Классы receiver
- Две проблемы с обработчиками событий
- Игнорирование коллег
- Переопределение значений аргументов события
- Классы с большим числом событий
- Проект "Город и его службы"
- Наследование и универсальность
- Синтаксис универсального класса
- Класс с универсальными методами
- Два основных механизма объектной технологии
- Стек. От абстрактного, универсального класса к конкретным версиям
- Ограниченная универсальность
- Синтаксис ограничений
- Список с возможностью поиска элементов по ключу
- Как справиться с арифметикой
- Родовое порождение класса. Предложение using
- Универсальность и специальные случаи классов
- Универсальные структуры
- Универсальные интерфейсы
- Универсальные делегаты
- Framework .Net и универсальность
- Корректность и устойчивость программных систем
- Жизненный цикл программной системы
- Три закона программотехники Первый закон (закон для разработчика)
- Второй закон (закон для пользователя)
- Третий закон (закон чечако)
- Отладка
- Создание надежного кода
- Искусство отладки
- Отладочная печать и условная компиляция
- Классы Debug и Trace
- Метод Флойда и утверждения Assert
- Классы StackTrace и BooleanSwitch
- Отладка и инструментальная среда Visual Studio .Net
- Обработка исключительных ситуаций
- Выбрасывание исключений. Создание объектов Exception
- Захват исключения
- Параллельная работа обработчиков исключений
- Блок finally
- Класс Exception
- Организация интерфейса
- Форма и элементы управления
- Взаимодействие форм
- Модальные и немодальные формы
- Передача информации между формами
- Образцы форм
- Главная кнопочная форма
- Шаблон формы для работы с классом
- Работа со списками (еще один шаблон)
- Элемент управления класса ListBox
- Наследование форм
- Два наследника формы TwoLists
- Огранизация меню в формах
- Создание меню в режиме проектирования
- Классы меню
- Создание инструментальной панели с командными кнопками
- Рисование в форме
- Класс Graphics
- Методы класса Graphics
- Класс Pen
- Класс Brush
- Проект "Паутина Безье, кисти и краски"
- Паутина Безье
- Событие Paint
- Кисти и краски
- Абстрактный класс Figure
- Классы семейства геометрических фигур
- Класс Ellipse
- Класс Circle
- Класс LittleCircle
- Класс Rect
- Класс Square
- Класс Person
- Список с курсором. Динамические структуры данных
- Классы элементов списка
- Организация интерфейса