Прошел курс. Получил код Dreamspark. Ввожу код на сайте, пишет: Срок действия этого кода проверки уже истек. Проверьте, правильно ли введен код. У вас осталось две попытки. Вы также можете выбрать другой способ проверки или предоставить соответствующие документы, подтверждающие ваш академический статус.
Как активировать код? |
Динамическая компоновка формы
Проблема с размещением элементов управления
Визуальные средства проектирования формы (режим Designer ) хороши тем, что программисту не нужно вычислять местоположение и размер элементов управления в пределах клиентской области формы. Он это делает визуально. Но в то же время мы не знаем, на каких компьютерах и при каких условиях будет работать наше приложение. Это зависит от следующих факторов:
- Приложение может работать на разных языках и тексты могут выступать за границы элементов управления и формы
- На мониторах может быть установлено разное разрешение
- Разные версии операционной системы могут по разному отображать элементы управления
Наиболее эффективный метод решения этих проблем - так спроектировать приложение, чтобы элементы управления и форма сами подстраивались под нестандартные условия именно во время выполнения программы, автоматически вычисляя свой размер и местоположение. Ниже рассматриваются средства, простые и более сложные, для динамической компоновки интерфейса пользователя.
Свойство AutoSize
Все элементы управления, включая форму, являются наследниками класса Control, в котором имеется булево свойство AutoSize. По умолчанию значение этого свойства равно false, но если изменить его на true, то элемент управления сам будет менять свои размеры в зависимости от содержимого. Следующие элементы имеют дополнительное уточняющее свойство AutoSizeMode:
- System.Windows.Forms.Button.AutoSizeMode
- System.Windows.Forms.DataGridViewColumn.AutoSizeMode
- System.Windows.Forms.Form.AutoSizeMode
- System.Windows.Forms.GroupBox.AutoSizeMode
- System.Windows.Forms.Panel.AutoSizeMode
- System.Windows.Forms.UserControl.AutoSizeMode
Это свойство ожидает одно из значений одноименного перечисления
- System.Windows.Forms.AutoSizeMode.GrowAndShrink - растягиваться и сжиматься
- System.Windows.Forms.AutoSizeMode.GrowOnly (по умолчанию) - только растягиваться
Пример размещения одной кнопки
В следующем примере на форме размещается одна кнопка, внутри которой имеется многострочный текст. Настройка свойств кнопки и самой формы дает им возможность подстраиваться под размеры своего содержимого: кнопка подстраивается под размер текста, форма подстраивается под размер кнопки.
using System; using System.Drawing; using System.Windows.Forms; namespace Test { // Класс приложения class MyClass : Form { public MyClass() // Конструктор { // Настройка формы // Заголовок окна this.Text = "Автоподстройка размещения"; // Включили автоподстройку формы this.AutoSize = true; // Пусть форма растягивается и сжимается this.AutoSizeMode = AutoSizeMode.GrowAndShrink; // Создание и настройка объекта кнопки Button btn = new Button(); // Привязали к форме btn.Parent = this; // Включили автоподстройку кнопки btn.AutoSize = true; // Задаем содержимое кнопки btn.Text = "У Лукоморья дуб зеленый" + Environment.NewLine + "Златая цепь на дубе том" + Environment.NewLine + "И днем и ночью кот ученый" + Environment.NewLine + "Все ходит по цепи кругом"; // Задаем шрифт btn.Font = new Font("Arial", 16, FontStyle.Underline); // Задаем расположение текста btn.TextAlign = ContentAlignment.TopLeft; // Задаем цвет текста btn.ForeColor = Color.Red; // Задаем стиль кнопки btn.FlatStyle = FlatStyle.Flat; // Цвет рамки кнопки btn.FlatAppearance.BorderColor = Color.Blue; // Ширина рамки кнопки btn.FlatAppearance.BorderSize = 15; } } // Запуск class Program { static void Main() { Application.EnableVisualStyles(); Application.Run(new MyClass());// Создание объекта формы } } }Листинг 16.1 . Демонстрация возможностей свойства AutoSizeMode
Вот результат выполнения примера
Обратите внимание, что при установке
this.AutoSizeMode = AutoSizeMode.GrowAndShrink;
возможность интерактивного изменения размеров формы отключается.
Пример размещения двух кнопок
Теперь попробуем разместить на форме две кнопки. Для тренировки упакуем уже разработанную кнопку в отдельный класс с именем MyButton, а вторую разместим как обычно и без лишних дополнительных настроек. Код программы будет таким
using System; using System.Drawing; using System.Windows.Forms; namespace Test { // Класс расширения кнопки class MyButton : Button { public MyButton() // Конструктор { // Настройка класса расширения кнопки // Включили автоподстройку кнопки this.AutoSize = true; // Задаем содержимое кнопки this.Text = "У Лукоморья дуб зеленый" + Environment.NewLine + "Златая цепь на дубе том" + Environment.NewLine + "И днем и ночью кот ученый" + Environment.NewLine + "Все ходит по цепи кругом"; // Задаем шрифт this.Font = new Font("Arial", 16, FontStyle.Underline); // Задаем расположение текста this.TextAlign = ContentAlignment.TopLeft; // Задаем цвет текста this.ForeColor = Color.Red; // Задаем стиль кнопки this.FlatStyle = FlatStyle.Flat; // Цвет рамки кнопки this.FlatAppearance.BorderColor = Color.Blue; // Ширина рамки кнопки this.FlatAppearance.BorderSize = 15; } } // Класс приложения class MyClass : Form { public MyClass() // Конструктор { // Настройка формы // Заголовок окна this.Text = "Автоподстройка размещения двух кнопок"; // Включили автоподстройку формы this.AutoSize = true; // Установили режим: пусть форма растягивается и сжимается this.AutoSizeMode = AutoSizeMode.GrowAndShrink; // Создание и настройка объекта первой кнопки Button btnFirst = new Button(); // Привязали первую кнопку к форме btnFirst.Parent = this; // Включили автоподстройку первой кнопки btnFirst.AutoSize = true; // Задаем содержимое первой кнопки btnFirst.Text = "Хороши весной в саду цветочки" + Environment.NewLine + "Еще лучше девушки весной"; // Все остальное для первой кнопки по умолчанию ... // Создание и настройка объекта второй кнопки MyButton btnSecond = new MyButton(); // Привязали вторую кнопку к форме btnSecond.Parent = this; // Позиционируем вторую кнопку справа от первой btnSecond.Location = new Point(btnFirst.Right, 0); // Все остальное для второй кнопки настроено в расширении ... } } // Запуск class Program { static void Main() { Application.EnableVisualStyles(); Application.Run(new MyClass());// Создание объекта формы } } }Листинг 16.2 . Пример размещения двух кнопок с автоподстройкой
Результат выполнения примера будет таким
В классе Control есть событие Layout (размещение), которое генерируется всякий раз, когда родителю необходимо переразместить свои дочерние элементы управления. В обработчике этого события мы можем руками пересчитать новые позиции элементов управления и их размеры. Для решения той же задачи класс Control имеет виртуальное свойство LayoutEngine (механизм размещения), в реализацию которого можно заложить свою логику динамического размещения дочерних элементов управления.
Имеются, также, специальные классы динамического размещения:
- System.Windows.Forms.FlowLayoutPanel - панель плавающего размещения дочерних элементов управления
- System.Windows.Forms.TableLayoutPanel - панель табличного размещения дочерних элементов управления