Когда мы должны вызывать base.OnPaint (), когда переопределяем OnPaint? - PullRequest
6 голосов
/ 11 февраля 2012

Мне интересно, когда мы должны вызывать base.OnPaint, когда мы переопределяем OnPaint в программе для Windows?

Ответы [ 3 ]

7 голосов
/ 11 февраля 2012

Вы не переопределяете метод OnPaint().Вы просто подписываетесь на событие Paint, поэтому не следует вызывать base.OnPaint().
Вы должны (могли) вызывать base.OnPaint() только при переопределении метода OnPaint() в форме:

protected override OnPaint(PaintEventArgs e)
{
    base.OnPaint(e);

    // ... other drawing commands
}

Метод OnPaint в элементах управления Windows Forms фактически вызывает событие Paint элемента управления, а также рисует поверхность элемента управления.Вызывая метод OnPaint базовой формы в обработчике событий Paint, вы фактически указываете форме снова и снова вызывать обработчик Paint, и поэтому вы попадете в бесконечный цикл, и, следовательно, StackOverflowException.

Когда вы переопределяете метод OnPaint элемента управления, обычно вы должны вызывать базовый метод, чтобы элемент управления рисовал сам, а также вызывать обработчики событий, подписанные на событие Paint.Если вы не вызовете базовый метод, некоторые аспекты управления не будут отображаться, и никакой обработчик событий не будет вызван.

3 голосов
/ 11 февраля 2012

Метод base.OnPaint(e) вызывает событие Paint, поэтому ваш метод Form1_Paint вызывается внутри base.OnPaint. Это приводит к бесконечному циклу и в конечном итоге StackOverflowException.

Правильнее было бы переопределить метод OnPaint:

protected override void OnPaint(PaintEventArgs e)
{
    base.OnPaint(e);
    //custom painting here...
}

Для получения дополнительной информации см. Ссылка MSDN .

2 голосов
/ 11 февраля 2012

из приведенного выше кода Вы не переопределяете метод OnPaint, вы фактически обрабатываете событие рисования и, конечно, если вы попытаетесь снова нарисовать его внутри обработчика, вы получите бесконечный цикл.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...