Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Обработка события

8.3K
24 июля 2009 года
roman@
63 / / 10.11.2007
Привет, разъясните пожалуйста в чем разница между обработкой события с помощью например form.Paint+=new PaintEventHandler(…) protected override void OnPaint(…). Я читаю кригу Чарльза Петцольда “ Программирование для Windows на C#”
842
25 июля 2009 года
sigmov
301 / / 16.09.2008
Цитата: roman@
Привет, разъясните пожалуйста в чем разница между обработкой события с помощью например form.Paint+=new PaintEventHandler(…) protected override void OnPaint(…). Я читаю кригу Чарльза Петцольда “ Программирование для Windows на C#”



form.Paint+=new PaintEventHandler(…)
Это реализация события отрисовки\перерисовки окна WinForms

А вот:
protected override void OnPaint(…)
Это по моему вообще из MFC - но суть аналогичная для классов производных CDialog

1.9K
25 июля 2009 года
GreenRiver
451 / / 20.07.2008
Цитата: sigmov

Это по моему вообще из MFC - но суть аналогичная для классов производных CDialog


Такая схема используется и в VCL, и в BCL (WinForms), причем во всех компонентах где обрабатываются события от клавиатуры, мыши, перерисовки.

Суть в следующем:
Допустим есть базовый компонент Component, который умеет себя перерисовывать (иерархия классов здесь от балды :)). В момент перерисовки он вызывает виртуальный метод OnPaint, который и генерирует событие, если на него кто-то подписан:

 
Код:
class Control : Component
    {
        public event PaintEventHandler Paint;
        protected virtual void OnPaint()
        {
            if (Paint != null) Paint(this, new PaintEventArgs(...));
        }
    }


Таким образом есть два способа управлять отрисовкой:
1. Подписаться на событие Paint
 
Код:
Component MyComponent = new Component();
   ...
   MyComponent.Paint += new EventHandler(...);


2. Создать наследника и переопределить метод OnPaint. (Кстати, если не вызывать базовый метод base.OnPaint событие Paint генерироваться не будет, что в общем-то и логично :))
 
Код:
class MyPaintBox : Control
    {
        protected override void OnPaint(PaintEventArgs e)
        {
            base.OnPaint(e);
        }
    }
8.3K
25 июля 2009 года
roman@
63 / / 10.11.2007
То есть два способа в принципе эквивалентные но с помощью подписке можно осуществить несколько обработчиков если нужно. А можно например переопределить метод OnPaint и в нем вызвать базовый метод и потом подключить обработчик?
288
25 июля 2009 года
nikitozz
1.2K / / 09.03.2007
Цитата: roman@
То есть два способа в принципе эквивалентные но с помощью подписке можно осуществить несколько обработчиков если нужно. А можно например переопределить метод OnPaint и в нем вызвать базовый метод и потом подключить обработчик?



Я бы не сказал, что они эквивалентные. Это абсолютно разные вещи, хотя в конкретной реализации и могут делать одно и то же (и то только потому, что одно - это просто вызов другого). Важно понять то, что объснил GreenRiver. PaintEventHandler(…) - это обработчик события, а OnPaint - уже виртуальная функиця.
Для использования OnPaint вам необходимо написать свой класс, унаследованный от какого-либо другого. При чем все объекты данного класса будут вести себя так, как вы прописали в OnPaint.
При использовании PaintEventHandler(…) вы не создете новый класс и определяете поведение лишь одного данного объекта.

8.3K
25 июля 2009 года
roman@
63 / / 10.11.2007
спасибо
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог