Windows Forms UserControl не вызывает переопределения - PullRequest
0 голосов
/ 30 сентября 2008

Я создаю элемент управления 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 никогда не вызывается.

Есть идеи о вещах, которые нужно искать? Я много сделал с C ++, но я довольно новичок в WinForms и WPF, поэтому вполне может быть что-то очевидное ...

Ответы [ 2 ]

2 голосов
/ 30 сентября 2008

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

SetStyle(ControlStyles::UserPaint, true);


Обновление

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

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

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

1 голос
/ 30 сентября 2008

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

...