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

DrawView view = new DrawView (this, wnd); // Создаем новый вид

viewList.Add (view); // Запоминаем в списке его адрес

view.Show();  // Аналогично вызову API-функции ShowWindow

}

public Line NewLine()// Создание новой линии

{

Line line = new Line (curPen.Color, curPen.Width);

lineList.Add (line);

isDirty = true;    // Флаг: документ изменился

return line;

}

  public void UpdateAllViews (DrawView sender, Line line) // Оповещение всех видов об изменении данных документа

{

foreach (DrawView view in viewList)

{

if (view.Equals (sender)) // Вид, изменивший данные, не перерисовывается

continue;

if (line != null) // Если ссылка не ноль, перерисовываем только обрамляющий прямоугольник

view.Invalidate (line.Rect);

else // Стирается фон и перерисовывается вся клиентская область

view.Invalidate();

view.Update();     // Аналогично вызову API-функции UpdateWindow

}

}

public void DeleteContents()// Уничтожаем рисунок

{

lineList.Clear();

UpdateAllViews (null, null);

}

}

Метод UpdateAllViews класса DrawDoc позволяют оперативно следить за изменениями видов и корректировать все другие виды того же документа сразу вслед за внесенными изменениями. Эта функция для каждого вида документа помечает как поврежденную либо часть, либо всю клиентскую область окна. Операционная система реагирует на это посылкой сообщения WM_PAINT, которое обрабатывается функцией перерисовки вида. Если вызвать UpdateAllViews из какого-нибудь метода класса DrawView и при этом передать this в качестве первого параметра sender (указатель на вид, провоцирующий перерисовку), то все другие виды этого же документа (кроме того, который все это затеял) будут перерисованы.

Текущая версия класса документа пока не содержит методов записи данных в файл и чтения их из файла. Эти функции будут вызываться в ответ на выбор пользователем соответствующих команд меню. Дело в том, что реакции на команды меню довольно просто вводятся в оконные классы, которым будет класс DrawView, но не в пользовательские классы, которым является только что созданный класс документа. Это происходит потому, что класс DrawDoc не является производным от какого-либо библиотечного класса, который уже содержит механизм обработки сообщений и передает его по наследству всем своим потомкам. Класс вида DrawView мы произведем от класса Form, который умеет реагировать на командные сообщения, поэтому он легко справится с задачей. В нужный момент времени, когда вид среагирует на команду меню, мы воспользуется услугами класса DrawDoc и попросим его записать или прочитать данные документа.

Класс вида документа

Класс для управления видами документов, которые являются окнами-потомками главного окна, должен быть произведен от оконной формы, то есть класса System.Windows.Forms.Form. Для создания стартовой заготовки такого класса выполните следующие действия:

¨  Переведите фокус в окно Solution Explorer и поставьте его в строку с именем проекта Draw;

¨  Выберите в контекстном меню команду Add4Add Class;

¨  В окне Templates выберите Windows Form, в поле Name введите имя файла DocView.cs и нажмите кнопку Open.

Мастер создаст новый файл, в котором будет стартовая заготовка класса DrawView, которую мы будем развивать так, чтобы ее поведение соответствовало поведению child-окна MDI-приложения. Дайте команду View Code и вы увидите следующий текст:

using System;

using System.Drawing;

using System.Collections;

using System.ComponentModel;

using System.Windows.Forms;

namespace Draw

{

public class DrawView : Form

{

private Container components = null;

public DrawView()

{

InitializeComponent();

}

#region Windows Form Designer generated code

protected override void Dispose( bool disposing )

{

if (disposing)

{

if (components != null)

{

components.Dispose();

}

}

base.Dispose (disposing);

}

private void InitializeComponent()

{

this.components = new System.ComponentModel.Container();

this.Size = new System.Drawing.Size (300,300);

this.Text = "DrawView";

}

#endregion

}

}