OnPaint
обычно не вызывается в UserControl
, если вы не установите соответствующий стиль, когда он создается с использованием метода SetStyle
. Вам нужно установить стиль UserPaint
в true для вызова OnPaint
.
SetStyle(ControlStyles::UserPaint, true);
Обновление
Недавно я сам столкнулся с этой проблемой и начал искать ответ. Я хотел выполнить некоторые вычисления во время рисования (чтобы использовать уникальную обработку сообщений рисования), но я не всегда получал вызов OnPaint
.
После копания в Reflector я обнаружил, что OnPaint
вызывается только в том случае, если прямоугольник отсечения соответствующего сообщения WM_PAINT
не пуст. У моего UserControl
экземпляра был дочерний элемент управления, который заполнил весь его клиентский регион и, следовательно, обрезал все это. Это означало, что прямоугольник отсечения был пуст и поэтому не нужно вызывать OnPaint
.
Я обошел это, переопределив WndProc
и добавив обработчик для WM_PAINT
напрямую, так как не смог найти другого способа добиться того, чего хотел.