Исследование MS Visual С#, страница 3

b.Click += new EventHandler (MyClickFunc);

Событие Click имеется в классе Control, а значит и классе Button (который от него происходит). Мы добавили в коллекцию делегатов события Click кнопки b делегата со ссылкой на MyClickFunc. Теперь добавьте в класс формы саму функцию обработки, в которой мы рисуем замкнутую кривую, соединяющую точки с помощью сплайн-аппроксимации.

private void MyClickFunc (object sender, EventArgs e)

{

Graphics g = CreateGraphics();

g.DrawString ("Wanna draw?\r\nOK.", Font, Brushes.Purple, 100, 50);

PointF[] pts = {

  new PointF (20.0F, 150.0F), new PointF (250.0F, 200.0F),

  new PointF (100.0F, 80.0F), new PointF (100.0F, 250.0F)

  };

g.DrawLines (new Pen(Color.BlueViolet, 1), pts);

g.DrawClosedCurve (new Pen(Color.Coral, 3), pts, 1.0F, FillMode.Alternate);

g.Dispose();

}

При запуске компилятор обнаружит ошибку, для исправления которой придется добавить директиву using. Нужное пространство имен определите путем анализа сообщения и MSDN.

Задание

1.  Добавьте кнопку стирания рисунка.

2.  Добейтесь перерисовки после изменения размеров окна.

3.  Если чувствуете силы и интерес, то добавьте возможность перетаскивать опорные точки мышью.

Назад к чисто консольному проекту

Чтобы двигаться дальше, надо натренировать мускулы — научиться пользоваться языком C#, приобрести навыки и технику владения новыми средствами языка. С# имеет много общих черт с С++, но он пошел гораздо дальше. Обсуждение новых реалий будет проводиться с точки зрения программиста, имеющего опыт в разработке программ на С++ и желающего быстро войти в курс дела. Многие имеют привычку (и это рационально) исследовать новые возможности языка, используя общеизвестные (или хорошо знакомые) структуры данных и алгоритмы.

Класс Man в начальном варианте содержит минимальный набор данных и методов (имя, возраст, конструктор, деструктор, функции ввода и вывода). Однако этого достаточно, чтобы показать, как реализуются такие базовые понятия ООП, как инкапсуляция и скрытие данных. Далее класс приобретает «детей» (производные классы Prof и Stud) с тем, чтобы можно было показать реализацию двух других концепций ООП: наследование и полиморфизм.

Попутно мы будем вводить в класс новые возможности, которые предоставляет язык С#, и вы увидите, как при этом улучшается качество кода в смысле надежности, читабельности и дальнейшего сопровождения. Создайте новый проект:

1.  В меню File4New выберите команду Project.

2.  В появившемся окне диалога New Project, в окне Project Type раскройте узел дерева под именем Visual C# Projects.

3.  В окне Templates выберите тип проекта Console Application.

4.  В окне Name задайте имя проекта ManSpace.

5.  В окне Location задайте или оставьте без изменения местоположение новой папки с файлами рабочего пространства (solution) и нажмите OK.

В результате работы мастера студии в проекте (кроме служебных файлов, описывающих состояние и настройки проекта) появятся cs-файлы (аббревиатура от C-Sharp): AssemblyInfo.cs и Class1.cs. Первый является файлом, который дает возможность скорректировать атрибуты сборки (assembly) .NET-приложения. Второй — представляет собой почти пустой каркас, точнее очень простую начальную заготовку консольного приложения C#.

Сборки (assemblies) в .Net являются теми строительными блоками, из которых строится приложение на основе библиотеки CLR (Common Language Runtime). Они содержат подробную информацию о типах данных и ресурсах, которые, будучи собранными вместе, составляют некоторую логическую единицу функциональности .NET-приложения. Обсуждение концепций и архитектуры .Net приведено во многих книгах, а также статьях MSDN. Мы не будем затрагивать эту тему, так как она требует длинного разговора. Произошло слишком много изменений в общем подходе к разработке приложений, чтобы изложить их кратко. Мы сосредоточимся на разработке кода, с помощью которого, я надеюсь, будет проиллюстрирован новый подход и изменившиеся возможности.

Рассмотрим файл начальной заготовки Class1.cs:

using System;      // Доступно пространство имен System

namespace ManSpace // Объявлено новое (наше) пространство имен

{

  /// <summary>

  /// Внутрь этих XML-тэгов помещайте описание класса или выкиньте тэги вовсе.

  /// Мощь XML-тэгов проявится в случае, если попросить студию автоматически

  /// создать документацию к программе. Кто любит этим заниматься? Сначала

  /// надо научиться создавать достойный код, а потом уже его документировать.

  /// Если тема автосоздания документации интересна, читайте книги.

  /// </summary>

class Class1

{

  static void Main (string[] args)    // Параметры коммандной строки

  {

           // TODO: Add code to start application here

  }

}

}

Безликому классу Class1 целесообразно дать другое имя, например ManTest, и ввести в файл изменения, которые декларируют испытуемый класс Man, а также содержат код для проверки его функционирования. Введите в текст программы следующие изменения.

using System;

namespace ManSpace

{

class Man

{

  protected string name;          // Данные, содержащиеся в любом объекте класса Man

  protected uint age;

  public Man()       // Default-constructor

  {

     name = "N/A";    // Имя не определено

     age = 0;

  }

  public Man(string n, uint a) // Полезный конструктор с параметрами

  {

     name = n;

     age  = a;

  }

  ~Man()    // Деструктор (Попытка освободить память)

  {

     name.Remove (0, name.Length);          // Можно проще: name = null;

  }

  public void In()       // Метод ввода данных объектов класса

  {

     Console.Write ("Name: ");

     name = Console.ReadLine();  // Имя – это строка символов

     Console.Write("Age: ");     // Возраст – это целое без знака

           //==== Преобразуем введенную строку в целое без знака

     age = uint.Parse (Console.ReadLine());

  }

  public void Out()          // Метод вывода данных

  {