Разработка приложений на языке C#. Полезные настройки. Особые спецификаторы формата, страница 11

void btnDraw_Click (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();  // Освобождаем ресурсы, связанные с контекстом устройства (HDC)

}

Задание

·  Добавьте кнопку стирания рисунка. Добейтесь правильной перерисовки содержимого после изменения размеров окна. Для решения этой задачи надо использовать только один объект Graphics (созданный системой).

·  Добавьте возможность перетаскивать мышью опорные точки сплайна.

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

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

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

·  Вновь сделайте активным проект MyConsole (команда Set as StartUpProject).

·  Добавьте в него новый класс (команда Add→Class). В диалоге задайте имя класса Man.

·  Добавьте файл, управляющий объектами класса Man. Для этого перетащите (Ctrl+Drag) один из файлов Test...и переименуйте его в TestMan.

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

C помощью инструментов студии добавьте в проект новый класс с именем Man. Он попадает в новый файл Man.cs, но должен остаться в том же пространстве имен MyConsole. В заготовку класса введите код, как показано ниже.

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

  protected int age;

  public Man() { name = "N/A"; age = 0; }    // Default constructor

  public Man(string n, int a) { name = n;  age = a; } //  Useful constructor

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

  {

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

  }

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

  {

    Console.Write ("Name: ");

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