Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Общие вопросы по .NET и C# > Как можно отмасштабировать окно с элементами?


Автор: vlsaf 25.10.2008, 12:44
Всем привет.

Имеется окно с контролами. Кнопки, текстбоксы, лаблы и т.д.
Задача такая, нужно это окно и все его содержимое увеличить или уменьшить в N раз.
(в полтора раза для примера).

Как это делается?
Говорят, что можно как-то все сожержимое окна перебрать в цикле и очень просто там все пометять?

Автор: diadiavova 25.10.2008, 13:10
А почему бы при расположении элементов на форме не воспользоваться такими свойствами как Dock и Anchor?

Автор: vlsaf 25.10.2008, 13:25
Это не то.  
Можно извращаться таким образом, но есть путь покрасивше.
Я видел, как работает такая штука безо всяких Dock и Anchor.
Впечатлился.

Автор: diadiavova 25.10.2008, 13:30
Извинясь - ступил. Они масштабирут не пропорционально, да и видимо речь идёт не об изменении размеров контейнера.
Если надо изменить размеры в N-ное количество раз то обходить в цикле надо соллекцию Controls формы и менять размеры каждого контрола. Правда в этом случае содержимое контейнеров не будет затронуто. Контейнеры надо обходить рекурсивно. Кроме того лейблы и прочие подобные элементы имеют по умолчанию Autosize = true это надо поменять.

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

Автор: MasterOfCode 25.10.2008, 13:52
Логичнее было бы предположить что этот вопрос задать в разделе Разработка Windows Forms

Автор: diadiavova 25.10.2008, 14:01
Вообще-то у контрола есть метод Scale, пропорционально меняющий размер как самого контрола, так и вложенных внего контролов. Возможно именно это имеется в виду?

Автор: vlsaf 25.10.2008, 14:17
Именно перебор в цикле коллекции.

Как это делается?

Я уже понял, что мне нужно.
Поменять Тор, Left, Width, Height и Font.Size для каждого контрола
Уменьшить или увеличить их, так, как надо.

Вроде больше ничего (на первый взгляд.)
Потом видно будет, что да как.

Автор: diadiavova 25.10.2008, 14:43
Ну, если в текущей форме это делать и только с контролами самой формы, а не вложенными в контейнеры тогда примерно так
Код

foreach(Control cont in this.Controls)
{
    //здесь обрабатываем сонтролы
    cont.Width = cont.Width*2;
    cont.Height=cont.Height*2;// и так далее
}


надо помнить о том, что если исходный размер умножается на дробное число, то в результате может получиться дробь, поэтому надо выполнить преобразование к типу Int32. Если надо это провернуть сне с самой формой, а с другим контролом, тогда вместо this указать его. А если ещё и вложенные контейнеры надо обойти, тогда потребуется рекурсивный обход.

Добавлено через 19 секунд
Ну, если в текущей форме это делать и только с контролами самой формы, а не вложенными в контейнеры тогда примерно так
Код

foreach(Control cont in this.Controls)
{
    //здесь обрабатываем сонтролы
    cont.Width = cont.Width*2;
    cont.Height=cont.Height*2;// и так далее
}


надо помнить о том, что если исходный размер умножается на дробное число, то в результате может получиться дробь, поэтому надо выполнить преобразование к типу Int32. Если надо это провернуть сне с самой формой, а с другим контролом, тогда вместо this указать его. А если ещё и вложенные контейнеры надо обойти, тогда потребуется рекурсивный обход.

Автор: vlsaf 25.10.2008, 14:52
Вот это для меня было самым важным 
foreach(Control cont in this.Controls)

Сенкс smile и +

Автор: diadiavova 25.10.2008, 14:52
Ну, если в текущей форме это делать и только с контролами самой формы, а не вложенными в контейнеры тогда примерно так
Код

foreach(Control cont in this.Controls)
{
    //здесь обрабатываем сонтролы
    cont.Width = cont.Width*2;
    cont.Height=cont.Height*2;// и так далее
}


надо помнить о том, что если исходный размер умножается на дробное число, то в результате может получиться дробь, поэтому надо выполнить преобразование к типу Int32. Если надо это провернуть сне с самой формой, а с другим контролом, тогда вместо this указать его. А если ещё и вложенные контейнеры надо обойти, тогда потребуется рекурсивный обход.

Добавлено через 1 минуту и 20 секунд
А всё-таки к методу Scale присмотреться стОит.

Добавлено через 1 минуту и 48 секунд
Ну, если в текущей форме это делать и только с контролами самой формы, а не вложенными в контейнеры тогда примерно так
Код

foreach(Control cont in this.Controls)
{
    //здесь обрабатываем сонтролы
    cont.Width = cont.Width*2;
    cont.Height=cont.Height*2;// и так далее
}


надо помнить о том, что если исходный размер умножается на дробное число, то в результате может получиться дробь, поэтому надо выполнить преобразование к типу Int32. Если надо это провернуть сне с самой формой, а с другим контролом, тогда вместо this указать его. А если ещё и вложенные контейнеры надо обойти, тогда потребуется рекурсивный обход.

Автор: Partizan 26.10.2008, 12:52
Цитата

Всем привет.

Имеется окно с контролами. Кнопки, текстбоксы, лаблы и т.д.
Задача такая, нужно это окно и все его содержимое увеличить или уменьшить в N раз.


LayoutPanel не помогает?

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