netlib.narod.ru< Назад | Оглавление | Далее >

Обработка события Paint

Правильнее всего рассматривать события на примерах. На практике при обработке события Paint вам в первую очередь потребуется знакомство с PaintEventHandler — делегатом, определенным в пространстве имен System.Windows.Forms одним оператором, который имеет такой вид (в синтаксисе С#):

  public delegate void PaintEventHandler(object objSender, PaintEventArgs pea);

Если вам кажется, что это прототип функции, вы недалеки от истины. Вторым параметром является класс PaintEventArgs, также определенный в пространстве имен System.Windows.Forms — вскоре мы его рассмотрим.

Для обработки события Paint одной из программ, приведенных ранее в этой главе, нужно определить в классе статический метод с такими же параметрами и таким же типом возвращаемого значения, что и у делегата PaintEventHandler:

  static void MyPaintHandler(object objSender, PaintEventArgs pea)
  {
      . . .
  }

Затем этот обработчик события подключается к событию Paint класса Form посредством специальной синтаксической конструкции:

  form.Paint += new PaintEventHandler(MyPaintHandler);

Paint — это событие, определенное в классе Control и, благодаря наследованию, входящее в класс Form. Единственными двумя операторами, применимыми к Paint, являются операторы присваивания += и -=. Оператор += устанавливает обработчик события, подключая метод к событию. Его синтаксис:

  объект.событие += new делегат(метод)

При отключении метода от события используется такой же синтаксис, но с оператором -=:

  объект.событие -= new делегат(метод)

Однако отключение метода от события требуется редко. Обычно обработчик события устанавливается и никогда не отключается от события.

Два параметра обработчика события Paint — объект, который я назвал objSender, и класс PaintEventArgs, для которого я использовал сокращенное название pea. Первый параметр содержит ссылку на объект, к которому применяется событие Paint; в нашем случае это объект form. Данный объект называется отправителем (sender), так как событие исходит от этого объекта.

Класс PaintEventArgs определен в пространстве имен System.Windows.Forms. Он содержит два свойства, Graphics и ClipRectangle, доступные только для чтения:


Свойства PaintEventArgs



Тип Свойство Доступ Описание

Graphics Graphics Чтение Крайне важный объект графического вывода
Rectangle ClipRectangle Чтение Недействительный прямоугольник


Свойство Graphics содержит экземпляр класса Graphics, определенного в пространстве имен System.Drawing. Graphics — важнейший класс библиотеки Windows Forms, по важности не уступающий Form. Этот класс служит для рисования графики и вывода текста на форме. В пространстве имен System.Drawing реализована система графического программирования GDI+. Это усовершенствованная версия интерфейса GDI (Graphics Device Interface, интерфейс графического устройства) системы Windows. О свойстве ClipRectangle рассказывается в главе 4.

В подавляющем большинстве программ этой книги вы будете встречать инструкцию:

  Graphics grfx = pea.Graphics;

в первой строке обработчика события Paint. Свой объект типа Graphics вы можете называть как угодно. Кто-то из программистов пишет graphics строчными буквами, но это название настолько длинное, что некоторые просто используют букву g. Я выбрал компромиссный подход.

Прежде чем углубиться в этот новый материал, рассмотрим программу, содержащую обработчик события Paint.

PaintEvent.cs

  //---------------------------------------------
  // PaintEvent.cs (C) 2001 by Charles Petzold
  //---------------------------------------------
  using System;
  using System.Drawing;
  using System.Windows.Forms;

  class PaintEvent
  {
      public static void Main()
      {
          Form form = new Form();
          form.Text = "Paint Event";
          form.Paint += new PaintEventHandler(MyPaintHandler);

          Application.Run(form);
      }
      static void MyPaintHandler(object objSender, PaintEventArgs pea)
      {
          Graphics grfx = pea.Graphics;

          grfx.Clear(Color.Chocolate);
      }
  }

После создания формы в методе Main, метод MyPaintHandler подключается к событию Paint формы. В обработчике события программа получает в составе класса PaintEventArgs объект Graphics и вызывает метод Clear этого объекта. Clear — это простой метод (возможно, самый простой из методов рисования), определенный в классе Graphics.


Методы класса Graphics (выборочно)



Метод Описание

void Clear(Color clr) Закрашивает всю клиентскую область заданным цветом


Параметр метода — объект типа Color, который я подробней рассмотрю в главе 3. Как я упоминал при рассмотрении программы FormProperties, показанной выше, самый простой путь получить цвет — указать одно из 141 имени цветов, являющихся статическими свойствами структуры Color.

Чтобы получить представление о частоте, с которой программа получает события Paint, попробуйте вставить в MyPaintHandler инструкцию:

  Console.WriteLine("Paint Event");

Кроме того, в следующей главе будет показана пара программ, визуально демонстрирующих частоту возникновения событий Paint.

С этого момента все программы для Windows Forms этой книги будут содержать в начале по меньшей мере три инструкции using.

  using System;
  using System.Drawing;
  using System.Windows.Forms;

Вообще говоря, эти инструкции — минимум, необходимый любому нетривиальному приложению Windows Forms.

Можно заметить связь между этими тремя инструкциями using и тремя DLL, ссылки на которые указывались при компиляции программы. Для программистов на С или C++ естественно думать, что инструкции using идентичны директивам препроцессора #include. Но это не так! Инструкции using ближе к инструкциям With языка Visual Basic. Они существуют только для того, чтобы не требовалось вводить полные имена классов. Все, что в программах на С и C++ обычно делают файлы заголовков (например, объявление типов, функций и классов), здесь обеспечивают DLL, указываемые как ссылки (references), и те же DLL связываются с запускаемой программой для реализации этих классов.


netlib.narod.ru< Назад | Оглавление | Далее >

Сайт управляется системой uCoz