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

¨  текущее перо, которым рисует пользователь,

¨  признак (флаг) того, что документ изменен, то есть отличается от своей сохраненной версии,

¨  индекс или номер документа, который выводится в заголовках всех соответствующих ему видов.

Список документов мы создавать не будем, так как класс Form, от которого происходит MainWindow уже имеет свойство MdiChildren, которое представляет собой массив ссылок на окна-потомки. Объект класса главного окна будет заполнять его ссылками на окна видов, располагающихся в его клиентской области, то есть на объекты класса окон-потомков. Мы назовем этот класс DrawView и создадим его позже. В окнах видов, как вы помните, будут отображаться данные одного или нескольких документов. Другие свойства: MdiParent, IsMdiContainer тоже используются для устанавления отношений родитель-потомок между главным окном и окнами-потомками. Например, свойство MdiParent — это ссылка на единственное окно, являющееся родительским (parent) для окна вида. Все наши виды должны установить его равным значению той статической переменной mainWnd, которую мы уже ввели в класс главного окна.

Введите в класс MainWindow переменную docCount, которая будет хранить общее количество документов, и обнулите его в конструкторе класса. Как оказалось, этого достаточно для реализации поведения, соответствующего стандарту MDI в допущении, что все документы приложения с однотипны.

public static int docCount; // Счетчик числа документов

Создание новых документов удобно производить в отдельном методе класса MainWindow, который следует ввести в состав класса.

private DrawDoc CreateDocument()

{

docCount++;

return new DrawDoc (mainWnd);

}

Класс документа DrawDoc будет создан позже, но уже сейчас мы выработали требования к его конструктору. Он получает ссылку на главное окно и использует ее для передачи в первый связанный с ним вид. Каждый объект класса вид получает ссылку на главное окно и запоминает ее с помощью set-метода свойства MdiParent, устанавливая тем самым свое подчиненное отношение. В момент запуска MDI-приложения по устоявшемуся сценарию сразу же создается одно окно-потомок с новым документом. Для реализации такого поведения вставьте в конструктор класса MainWindow вызов функции CreateDocument, которая создает первый документ.

CreateDocument();

Далее мы внесем в класс MainWindow еще несколько изменений, но сейчас акцент в развитии приложения следует перенести в класс документа, который, как и в случае других версий рисовалок, будет пользоваться услугами вспомогательного класса "линия рисунка".

Класс «Линия рисунка»

Рисующее приложение уже давно стало испытательным образцом, на котором демонстрируюnся новые решения старых проблем, поэтому мы будем считать, что вы знакомы с той концептуальной моделью (структурой данных), которая используется для хранения рисунка и выводе его в окно вида, связанного с документом. Приведем лишь ее краткое описание. Рисунок — это список указателей на объекты класса «линия рисунка». Назовем этот класс Line. Каждый объект класса Line содержит коллекцию точек одной линии рисунка, а также некоторые атрибуты линии, например, ее цвет и толщину.

В составе класса целесообразно иметь метод для изображения самой линии в любом контексте устройства. Такая модель поведения отдельной линии позволит очень просто выполнять перерисовку всего рисунка. Достаточно осуществить проход по массиву или списку объектов класса Line и для каждой линии вызывать метод рисования. Таким образом, каждая линия сама изображает себя в том контексте устройства, который будет подан ей в качестве параметра. При этом каждая линия помнит свои атрибуты.

Другим важным свойством нового класса должна стать устойчивость. Это означает, что данные класса должны автономно записываться в файл и читаться из него. Для обозначения этого свойства закрепился термин — сериализуемость (serialization). Фактически это процесс записи объекта в файл или чтения из него. Ключевой идеей при введении понятия сериализуемости является требование того, что объект сам отвечает за сохранение и восстановление своего состояния.