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

Paint — особое событие!

Будьте осторожны при написании методов-обработчиков события Paint. Эти методы вызываются часто и иногда довольно неожиданно. Лучше всего, если обработчик Paint может перерисовать клиентскую область быстро, без задержек.

Ранее в этой главе я предлагал использовать для простой отладки окна сообщений. Но ни в коем случае не помещайте вызов MessageBox.Show в обработчик события Paint! Информационное окно перекроет часть клиентской области, в результате чего снова произойдет событие Paint. И снова, снова... По этой же причине никогда не помещайте вызовы Console.Read или Console.ReadLine в любые обработчики событий. Однако вызовы Console.Write или Console.WriteLine вполне безопасны.

Кроме того, не делайте ничего, что может накапливаться. В одной из своих первых программ для Windows Forms я написал обработчик Paint, который обращался к свойству Font, создавал новый шрифт вдвое большего размера и присваивал свойству Font этот новый шрифт. Каждый раз при возникновении события Paint шрифт становился вдвое больше, чем раньше. («Дорогая, я увеличил шрифт!», последняя серия.)

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

Во-первых, вы можете получить объект Graphics вне обработчика события Paint, вызвав метод CreateGraphics, имеющийся у класса Control и унаследованный Form. Во-вторых, можно инициировать событие Paint из других событий, используя метод Invalidate класса Control. Я покажу, как это делается, когда буду рассматривать события клавиатуры, мыши и таймера в главах 6, 8 и 10.


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

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