Переопределения Windows Forms UserControl не вызываются

Я создаю элемент управления Windows Forms, производный от UserControl, для встраивания в приложение WPF. Обычно я следовал процедурам, приведенным в этой ссылке.

public ref class CTiledImgViewControl : public UserControl
{
...

virtual void OnPaint( PaintEventArgs^ e ) override;

...
};

И в моем файле CPP:

void CTiledImgViewControl::OnPaint( PaintEventArgs^ e )
{
    UserControl::OnPaint(e);
    // do something interesting...
}

Все компилируется и запускается, однако метод OnPaint никогда не вызывается.

Любые идеи вещей, чтобы искать? Я много работал с С++, но я новичок в WinForms и WPF, так что это может быть что-то очевидное...


person Brian Stewart    schedule 29.09.2008    source источник
comment
Я обновил свой ответ, обнаружив аналогичную проблему в своей работе. Я надеюсь, что это помогает.   -  person Jeff Yates    schedule 08.01.2009


Ответы (2)


OnPaint обычно не вызывается в UserControl, если только вы не установите соответствующий стиль при его построении с использованием метода SetStyle. Вам нужно установить для стиля UserPaint значение true, чтобы OnPaint вызывался.

SetStyle(ControlStyles::UserPaint, true);


Обновлять

Недавно я сам столкнулся с этой проблемой и пошел искать ответ. Я хотел выполнить некоторые вычисления во время рисования (чтобы использовать уникальную обработку сообщений рисования), но я не всегда получал вызов OnPaint.

Покопавшись в Reflector, я обнаружил, что OnPaint вызывается только в том случае, если прямоугольник отсечения соответствующего сообщения WM_PAINT не пуст. У моего экземпляра UserControl был дочерний элемент управления, который заполнил всю его клиентскую область и, следовательно, обрезал его. Это означало, что прямоугольник отсечения был пуст и поэтому не вызывал OnPaint.

Я работал над этим, переопределяя WndProc и добавляя обработчик для WM_PAINT напрямую, поскольку я не мог найти другого способа добиться того, что хотел.

person Jeff Yates    schedule 29.09.2008

Я решил проблему, если кому интересно. Это произошло потому, что мой элемент управления WinForms был встроен в ViewBox. Я изменил его на сетку и сразу начал получать события рисования. Я думаю, что, задавая вопросы о WPF, вы всегда должны включать XAML в вопрос!

person Brian Stewart    schedule 30.09.2008