Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Разработка Windows Forms > размер User Control


Автор: anonym 2.12.2007, 12:31
Допустим я создал User Control, установил в его дизайнере размеры 100x100 и поместил на форму. В конструкторе этого контрола я обращаюсь к свойству Height, оно равно 100. Но если на главной форме этот контрол скажем растянуть по вертикали, то Height всё равно остаётся 100. Можно ли как-нибудь сделать, чтобы мы получали фактический размер, то есть тот размер, который контрол имеет на самой форме?

Автор: Dogo 2.12.2007, 13:37
Попробуй ClientRectangle.Height или Bounds.Height.

Автор: anonym 2.12.2007, 14:35
Не, та же фигня... Вообще как-то нелогично сделано... Почему сразу не даётся реальный размер? По-моему удобно бы было - растянул контрол на форме, он тут же сам и перерисовался при запуске в соответствии с новыми размерами...

Автор: Dogo 2.12.2007, 14:45
А ты наследовался к какому-то базовому контролу или ты наследуешь UserControl?
Вообще то о чем ты пишешь должно работать. Но только если ты наследуешься к UserControl тебе нужно переопределить OnResize.

Автор: anonym 2.12.2007, 16:12
Да, наследую от UserControl. В общем, у меня должна рисоваться окружность, которая так сказать вписывается в прямоугольник с нашим контролом. Естественно, для этого нужно знать размеры контрола.

OnResize это я так понимаю рястягивание во время выполнения? Мне-то немного другое нужно. Чтобы можно было перетащить наш контрол на форму, установить у него [в режиме дизайна самой формы] любые размеры и чтобы окружность рисовалась в соответствии с новыми размерами...

Автор: Dogo 2.12.2007, 16:40
Нет, это не только во время выполнения, но и в дизайн тайме тоже обрабатывается...
Попробуй ... smile

Автор: anonym 2.12.2007, 17:12
Dogo, спасибо за помощь. Но что именно нужно там написать?  smile 

UserControl1.Height = чему?

Автор: Dogo 2.12.2007, 17:25
Там нужно написать
Код

myCircle.Height = this.Height;
myCircle.Width = this.Width;

где myCircle  - это объект класса описывающего окружность, которая вписана в область контрола.

Автор: anonym 2.12.2007, 18:04
Dogo, Спасибо, вроде чё-то получается  smile 

Хмм... раньше у меня параметры окружности определялись в конструкторе класса UserControl1 сразу после InitializeComponent(). При этом размеры контрола соответствовали тем, которые мы задали в режиме дизайна самого контрола. Но если посмотреть на значения Height и Width немного погодя (сколько - для меня загадка smile ), то они уже становятся равными фактическим размерам контрола на форме. Попробовал пихнуть определение параметров в метод OnPaint - тоже работает)

Автор: Dogo 2.12.2007, 18:34
Цитата(anonym @  2.12.2007,  19:04 Найти цитируемый пост)
Попробовал пихнуть определение параметров в метод OnPaint - тоже работает

Конечно работает, после обработки OnResize, контрол инвалидейтится и перерисовывается. Соответственно вызывается OnPaint. Но OnPaint вызывается не только после OnResize => пересчет размеров будет проходить в пустую. Идейно в OnPaint должно происходить только рисование, никакой арифметики и прочей математики...  smile

Добавлено через 2 минуты и 18 секунд
Спасибо за "+"

Автор: anonym 2.12.2007, 19:04
Да, согласен)

Автор: anonym 2.12.2007, 22:57
Хмм... А вот ещё вопрос... Получается, событие Resize вызывается только если размеры, установленные в дизайнере контрола, не совпадают с фактическими размерами (установленными в дизайнере формы). Если же они совпадают, приходится делать все расчёты в конструкторе контрола. То есть получается, что в конструкторе и в методе OnResize у нас должен быть одинаковый код? Или может сделать третий метод и просто вызывать его из обоих?...

Автор: Dogo 2.12.2007, 23:11
Мне кажется, что лучше создать отдельный метод. В этом и заключается один из смыслов ООП ... smile  (да и в принципе программирования)
...а кстати, ОнРесайз, по-моему, вызывается после того как объект помещается на форму(дизайн-тайм), то есть в конструкторе вообще можно этого не делать, хотя никто не отменял первичную инициализацию свойств... smile

Автор: anonym 2.12.2007, 23:47
Цитата(Dogo @  2.12.2007,  23:11 Найти цитируемый пост)
ОнРесайз, по-моему, вызывается после того как объект помещается на форму(дизайн-тайм)

Неа) Я специально попробовал без конструктора... Размер 151;150 - всё рисуется. (даже в режиме дизайна =) ) Ставлю 150;150 - пропадает. 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)