2012-02-11 4 views
4

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

то, что я делаю:

private void Form1_Paint(object sender, PaintEventArgs e) 
     { 
      // If there is an image and it has a location, 
      // paint it when the Form is repainted. 
      base.OnPaint(e); 

     } 

я stackoerflowexception, почему?

ответ

6

Вы не переопределяете метод 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. Если вы не вызываете базовый метод, некоторые аспекты управления не будут нарисованы, и обработчик событий не будет вызван.

+0

Что делать, если вы хотите, чтобы событие Paint было поднято после «других команд рисования» метода переопределения? – mbeckish

+0

@mbeckish Вы можете легко вызвать базовый метод после ваших собственных рисунков, но результат зависит от типа элемента управления и того, что он делает в своем методе «OnPaint». Вы должны знать, что элемент управления может рисовать себя над тем, что вы только что нарисовали. Надеемся, что удаление фона не произойдет в методе OnPaint, а в методе OnPaintBackground. –

3

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

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

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

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

2

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

Смежные вопросы