Что-нибудь особенное, что мне нужно сделать, чтобы сообщение Paint было отправлено в элемент управления в C #? - PullRequest
0 голосов
/ 18 февраля 2010

У меня есть три класса, полученные из Control ... Class1, Class2 и Class3.

Class1 является родителем. Он содержит список объектов Class2, каждый из которых, в свою очередь, содержит список объектов Class3.

Каждый класс переопределяет метод OnPaint для рисования.

Class1 и Class2 рисуют себя нормально, но Class3.OnPaint никогда не вызывается.

Нужно ли делать что-то особенное (возможно, в Class2.OnPaint), чтобы гарантировать, что объекты Class3 станут недействительными и получат сообщение Paint?

Ответы [ 5 ]

1 голос
/ 18 февраля 2010

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

Можете ли вы опубликовать несколько упрощенных фрагментов кода, которые показывают проблему?

0 голосов
/ 18 февраля 2010

Мой плохой!Я не устанавливал расположение элементов управления Class3 относительно их родительского элемента управления, и, поскольку они были больше значений, чем размер родительского элемента управления, они всегда были вне экрана.

Спасибо за помощь!

0 голосов
/ 18 февраля 2010

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

0 голосов
/ 18 февраля 2010

Попробуйте это в конструкторе элемента управления.

this.SetStyle(ControlStyles.UserPaint, true);
0 голосов
/ 18 февраля 2010

Под "содержит как список" вы подразумеваете, что (1) дочерние элементы управления были добавлены в .Controls родительского элемента управления, или (2) что у вас есть список элементов управления в качестве переменной внутри родительского элемента управления?

Если (1) имеет место, вы можете вызвать рисование родительского элемента управления и всех дочерних элементов управления, вызвав .Refresh() в родительском элементе управления. Вызов .Invalidate() не обязательно будет означать, что элемент управления или его дочерние элементы будут окрашены сразу.

Если (2) имеет место, вы должны добавить элементы управления к .Controls на родительском элементе управления, чтобы они были закрашены.

...