Опубликован: 25.03.2010 | Уровень: для всех | Доступ: платный
Лекция 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. Ввожу код на сайте, пишет:

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

 

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

Денис Пашков
Денис Пашков
Россия
Татьяна Ковалюк
Татьяна Ковалюк
Украина, Киев, Киевский политехнический институт, 1974