Вы не переопределяете метод 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
. Если вы не вызываете базовый метод, некоторые аспекты управления не будут нарисованы, и обработчик событий не будет вызван.
Что делать, если вы хотите, чтобы событие Paint было поднято после «других команд рисования» метода переопределения? – mbeckish
@mbeckish Вы можете легко вызвать базовый метод после ваших собственных рисунков, но результат зависит от типа элемента управления и того, что он делает в своем методе «OnPaint». Вы должны знать, что элемент управления может рисовать себя над тем, что вы только что нарисовали. Надеемся, что удаление фона не произойдет в методе OnPaint, а в методе OnPaintBackground. –