| 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 пикселов. Мне кажется, что можно на это рассчитывать.

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