Обработка события
form.Paint+=new PaintEventHandler(…)
Это реализация события отрисовки\перерисовки окна WinForms
А вот:
protected override void OnPaint(…)
Это по моему вообще из MFC - но суть аналогичная для классов производных CDialog
Это по моему вообще из MFC - но суть аналогичная для классов производных CDialog
Такая схема используется и в VCL, и в BCL (WinForms), причем во всех компонентах где обрабатываются события от клавиатуры, мыши, перерисовки.
Суть в следующем:
Допустим есть базовый компонент Component, который умеет себя перерисовывать (иерархия классов здесь от балды :)). В момент перерисовки он вызывает виртуальный метод OnPaint, который и генерирует событие, если на него кто-то подписан:
{
public event PaintEventHandler Paint;
protected virtual void OnPaint()
{
if (Paint != null) Paint(this, new PaintEventArgs(...));
}
}
Таким образом есть два способа управлять отрисовкой:
1. Подписаться на событие Paint
...
MyComponent.Paint += new EventHandler(...);
2. Создать наследника и переопределить метод OnPaint. (Кстати, если не вызывать базовый метод base.OnPaint событие Paint генерироваться не будет, что в общем-то и логично :))
{
protected override void OnPaint(PaintEventArgs e)
{
base.OnPaint(e);
}
}
Я бы не сказал, что они эквивалентные. Это абсолютно разные вещи, хотя в конкретной реализации и могут делать одно и то же (и то только потому, что одно - это просто вызов другого). Важно понять то, что объснил GreenRiver. PaintEventHandler(…) - это обработчик события, а OnPaint - уже виртуальная функиця.
Для использования OnPaint вам необходимо написать свой класс, унаследованный от какого-либо другого. При чем все объекты данного класса будут вести себя так, как вы прописали в OnPaint.
При использовании PaintEventHandler(…) вы не создете новый класс и определяете поведение лишь одного данного объекта.