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() // Метод вывода данных
{
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.