Опубликован: 25.03.2010 | Доступ: свободный | Студентов: 1435 / 157 | Оценка: 4.31 / 4.00 | Длительность: 25:42:00
Лекция 16:

Динамическая компоновка формы

Аннотация: В лекции описывается как спроектировать приложение, чтобы элементы управления и форма сами подстраивались под нестандартные условия именно во время выполнения программы, автоматически вычисляя свой размер и местоположение.

Проблема с размещением элементов управления

Визуальные средства проектирования формы (режим 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 - панель табличного размещения дочерних элементов управления
Максим Филатов
Максим Филатов

Прошел курс. Получил код Dreamspark. Ввожу код на сайте, пишет:

Срок действия этого кода проверки уже истек. Проверьте, правильно ли введен код. У вас осталось две попытки. Вы также можете выбрать другой способ проверки или предоставить соответствующие документы, подтверждающие ваш академический статус.

 

Как активировать код?