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 | < Назад | Оглавление | Далее > |