Пользовательский контроль Windows Forms переопределяет, что он не вызывается

StackOverflow https://stackoverflow.com/questions/150900

Вопрос

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

Это было полезно?

Решение

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

SetStyle(ControlStyles::UserPaint, true);


Обновить

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

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

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

Другие советы

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top