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

Несколько форм, несколько обработчиков

Чтобы лучше понять, как работает обработчик события Paint, рассмотрим несколько вариаций на эту тему. В следующей программе используется один и тот же обработчик события Paint для двух создаваемых форм.

PaintTwoForms.cs

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

  class PaintTwoForms
  {
      static Form form1, form2;

      public static void Main()
      {
          form1 = new Form();
          form2 = new Form();

          form1.Text      = "First Form";
          form1.BackColor = Color.White;
          form1.Paint    += new PaintEventHandler(MyPaintHandler);

          form2.Text      = "Second Form";
          form2.BackColor = Color.White;
          form2.Paint    += new PaintEventHandler(MyPaintHandler);
          form2.Show();

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

          if(form == form1)
              str = "Hello from the first form!";
          else
              str = "Hello from the second form";

          grfx.DrawString(str, form.Font, Brushes.Black, 0, 0);
      }
  }

Обратите внимание, что объекты Form являются полями и поэтому доступны как Main, так и обработчику события Paint. Каждый вызов обработчика события Paint относится к одной из двух форм, создаваемых программой. Обработчик события может определить, к какой форме относится событие, сравнив параметр objSender (приведенный к типу Form) с двумя объектами Form, являющимися полями. Если закрыть глаза на небольшую проблему с регистром символов, можно заменить всю эту конструкцию if/else одним оператором:

  str = "Hello from the " + form.Text;

А теперь поступим наоборот: создадим одну форму и подключим к ней два обработчика события Paint.

TwoPaintHandlers.cs

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

  class TwoPaintHandlers
  {
      public static void Main()
      {
          Form form = new Form();
          form.Text      = "Two Paint Handlers";
          form.BackColor = Color.White;
          form.Paint    += new PaintEventHandler(PaintHandler1);
          form.Paint    += new PaintEventHandler(PaintHandler2);

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

          grfx.DrawString("First Paint Event Handler", form.Font,
                          Brushes.Black, 0, 0);
      }
      static void PaintHandler2(object objSender, PaintEventArgs pea)
      {
          Form     form = (Form)objSender;
          Graphics grfx = pea.Graphics;

          grfx.DrawString("Second Paint Event Handler", form.Font,
                          Brushes.Black, 0, 100);
      }
  }

Эта программа подчеркивает один из интересных аспектов подключения обработчиков событий. Если имеется более одного обработчика события, все обработчики вызываются по порядку. Заметьте, что методу DrawString передаются координаты (0, 0) в первом обработчике и (0, 100) — во втором. Я предположил, что высота шрифта по умолчанию не превышает 100 пикселов. Мне кажется, что можно на это рассчитывать.


Рис. 2.9.


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

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