Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > .NET для новичков > Переопределение OnPaint


Автор: yngwie19 5.8.2009, 22:04
Здравствуйте. У меня вот какой вопрос. В книге Петцольда рассказывается про создание обработчика для события Paint, и говорится что можно его создать как статический метод класса или переопределить виртуальный метод OnPaint. С первым все понятно, но по второму есть пара вопросов:
1) В каких случаях нужно использовать второй способ и вообще какой применяют чаще?
2) Также говорится что из переопределенного метода OnPaint нужно вызывать его для базового класса (base.OnPaint(...)), поясните зачем?

Автор: diadiavova 5.8.2009, 23:39
Цитата(yngwie19 @  5.8.2009,  23:04 Найти цитируемый пост)
что можно его создать как статический метод класса

Почему статический? smile 
Цитата(yngwie19 @  5.8.2009,  23:04 Найти цитируемый пост)
В каких случаях нужно использовать второй способ и вообще какой применяют чаще?

Если создаёшь собственный контрол на базе существующего - переопределяй, а если просто используешь существующий контрол, в котором надо что-то рисовать - то ничего переопределить в нём ты просто не сможешь, там обработка события - единственный доступный способ устойчивой прорисовки.
Цитата(yngwie19 @  5.8.2009,  23:04 Найти цитируемый пост)
Также говорится что из переопределенного метода OnPaint нужно вызывать его для базового класса (base.OnPaint(...)), поясните зачем?

Затем, что в этом методе базового класса тоже выполняются какие-то действия и если ты переопределяешь метод, то во всех случаях, когда в базовом классе вызывался этот метод, вместо него будет вызываться твой и логика базового класса может оказаться нарушенной. Чтобы этого не произошло и действия предусмотренные данным методом базового класса всё-таки выполнялись надо его вызвать.

Автор: yngwie19 6.8.2009, 00:20
Цитата(diadiavova @  5.8.2009,  23:39 Найти цитируемый пост)
Почему статический?

имею в виду обработчик., который на основе делегата. Он ведь должен быть объявлен как static?

Цитата(diadiavova @  5.8.2009,  23:39 Найти цитируемый пост)
Если создаёшь собственный контрол на базе существующего - переопределяй


в Петцольде написано, что метод OnPaint класса Control отвечает за вызов всех установленных обработчиков события Paint. Значит чтобы они вызывались надо сделать так чтобы был вызов OnPaint из класса Control так? а это можно сделать только через base.OnPaint?

Автор: diadiavova 6.8.2009, 00:28
Цитата(yngwie19 @  6.8.2009,  01:20 Найти цитируемый пост)
Он ведь должен быть объявлен как static?

Зачем?

Цитата(yngwie19 @  6.8.2009,  01:20 Найти цитируемый пост)
а это можно сделать только через base.OnPaint? 

Да, и не только. В базовых классах может выполняться какая-то другая прорисовка, да и вообще мало личто там ещё делается, об этом обычно ничего не известно, а вот чтобы не нарушать работу базовых классах в переопределяемых методах вызываются их переопределённые версии.

Автор: yngwie19 6.8.2009, 00:39
diadiavova, Спасибо, да кстати. тот же Петцольд пишет, что в классе Form нет реализации метода OnPaint и поэтому сделав:
Код

class MyConrol : Form
{
       protected override void OnPaint(...)
       {
              base.OnPaint(...)
       }
}

Мы по сути через иерархию классов вызываем его в Control, который уже отвечает за вызов всех установленных обработчиков события Paint? главное до него добраться?

P.S: 
Цитата(yngwie19 @  6.8.2009,  00:20 Найти цитируемый пост)
метод OnPaint класса Control отвечает за вызов всех установленных обработчиков события Paint

которые унаследованные от Control или Form и т.д, или все которые есть в других классах не производных Form или Control?

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)