Рисующее приложение в версии .NET, страница 2

Container container = new Container();

Component component = new Component();

container.Add (component);

container.Remove (component);

Второй параметр метода Add позволяет также именовать компоненты, вкладываемые в контейнер. Например,

container.Add (component, "PhoneBook");

Методы контейнерного класса позволяют управлять сразу всеми компонентами. Например, вызов метода Dispose для объекта класса Container (вы видите его в переопределенной версии виртуальной функции Dispose класса Form) автоматически вызывает этот метод для всех компонентов, хранящихся в контейнере, что позволяет эффективно освободить ресурсы, которые более не требуются.

Одним из отличий библиотеки .NET Framework от MFC является то, что одинаковые по сути методы разных классов имеют одно и то же имя. Это убеждает нас в том, что библиотека была разработана под руководством либо одного человека, либо сплоченной командой, имеющей единую ясную концепцию.

Развитие приложения начнем с того, что изменим список используемых пространств имен (директив using) на:

using System;

using System.Drawing;

using System.Drawing.Printing;

using System.Collections;

using System.ComponentModel;

using System.Windows.Forms;

Здесь мы добавили поддержку вывода на принтер и убрали доступ к пространству имен System.Data, которое в основном состоит из классов, поддерживающих архитектуру ADO.NET. Так как наше приложение будет работать в стандарте MDI (Multiple-Document Interface), основу которого составляет главное окно (MDI parent form), то целесообразно запомнить адрес объекта класса MainWindow для того, чтобы иметь возможность впоследствии передать его объектам других классов, задействованных в приложении. Дело в том, что главное MDI-окно будет содержать множество child-окон, отображающих данные различных документов приложения. Вставьте внутрь класса MainWindow объявление такой статической переменной:

public static MainWindow mainWnd;

Инициализацию этого адреса проведем в конструкторе класса.

public MainWindow()

{

mainWnd = this; // Запоминаем адрес главного окна

InitializeComponent();// Этот вызов необходим для поддержки Win Form Designer

}

Пусть вас не смущает тот факт, что я говорю об адресах, хотя в коде нет никаких намеков на них. Дело в том, что все типы данных в CLR (Common Language Runtime) делятся на две категории: Value types и Reference types. Первая категория объединяет те “простые” типы, память для которых отводится на этапе компиляции, то есть «рано». Вторая категория объединяет массивы переменных и классы, память для которых всегда выделяется на этапе выполнения, то есть “поздно”. Память для объектов второй категории захватывается в области heap и происходит это на этапе выполнения динамически, то есть с помощью операции new.

Фокус в том, что переменная mainWnd класса MainWindow по умолчанию является ссылкой на объект класса, а не самим объектом, как было бы в «непричесанном» (unmanaged) С++. В режиме безопасного кода (safe mode), который по умолчанию действует в С#, понятие указателя или адреса переменной не используется. Вместо него надо пользоваться понятием ссылка (reference). Ссылку можно представить себе как автоматически или само-разадресуемый указатель, который мы уже создали и инициализировали с помощью операции new. Именно этот указатель this мы и присваиваем статической переменной mainWnd в конструкторе класса. Фактически это адрес, но мы работаем с ним, как с объектом класса, а точнее, ссылкой на объект.

Развитие оконной формы

Управление формой производится в окне MainWindow.cs[Design]. Если вы вдруг потеряли это окно, то его можно вернуть, дав команду View Designer, которая присутствует в контекстном меню, возникающем над именем файла MainWindow.cs окна Solution Explorer. Откройте окно дизайнера формы и измените свойство Text, которое в данный момент имеет значение Form1, на Draw. Кроме того, установите свойство IsMdiContainer в True, так как класс главного окна MainWindow должен управлять child-окнами, которые будут расположены в клиентской области главного окна. С главным окном обычно связывают такие элементы интерфейса, как: меню, панель инструментов и статус строка. Этих элементов пока еще нет в нашей форме. Их следует добавить с помощью инструмента студии, называемого Toolbox. Он расположен в автоматически всплывающем окне (режим Auto Hide), которое прячется в левой части окна редактирования. Наведите указатель мыши на заголовок этого окна, выберите в появившемся окне Toolbox элемент MainMenu и щелкните левой кнопкой на форме.