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

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

Стыковка с применением панельных контейнеров

Для более сложного алгоритма размещения можно использовать элемент управления Panel как контейнер, дочерний по отношению к форме. Этот элемент служит именно для компоновки своих дочерних элементов управления как единой группы. Он хорош тем, что имеет встроенные полосы прокрутки и настраиваемую рамку. Но в обычном элементе Panel нужно явно позиционировать элементы управления или использовать стыковку, которую мы и рассматриваем. Более развитыми с точки зрения размещения являются другие панели: FlowLayoutPanel, TableLayoutPanel, SplitContainer.

Ниже повторен предыдущий пример с применением сдвоенной панели SplitContainer, в которой пользователь может интерактивно перемещать внутреннюю границу.

using System;
using System.Drawing;
using System.Windows.Forms;
    
namespace Test
{
    // Класс приложения
    class MyClass : Form
    {
        public MyClass()
        {
            this.Text = "Применение панелей";
    
            // Создаем двухпанельный элемент с изменяемой границей
            SplitContainer split = new SplitContainer();
            split.Parent = this;// Привязали к форме
            split.Dock = DockStyle.Fill;
            split.Orientation = Orientation.Vertical;// По умолчанию
            // Блокируем автоматическое изменение левой панели
            split.FixedPanel = FixedPanel.Panel1;
    
            // Создаем многострочный TextBox в правой панели
            TextBox textBox = new TextBox();
            split.Panel2.Controls.Add(textBox);// Привязали к правой панели
            textBox.Multiline = true;
            textBox.Dock = DockStyle.Fill;// Распахнули
            // Задаем начальный текст
            textBox.Text = "Буря мглою небо 
    кроет" + Environment.NewLine
                + "Вихри снежные крутя" + Environment.NewLine
                + "То как зверь она завоет\r\n"
                + "То заплачет как дитя\r\n\r\n"
                + "Привет всем!";
            textBox.WordWrap = false;// Отключаем перенос слов
    
            // Создаем объект дерева в левой панели
            TreeView tree = new TreeView();
            split.Panel1.Controls.Add(tree);// Привязали к левой панели
            tree.Dock = DockStyle.Fill;// Распахнули
            tree.Nodes.Add("tree");// Добавили узел
    
            // Создаем панель инструментов
            ToolStrip tool = new ToolStrip();
            this.Controls.Add(tool);
            tool.Items.Add("tool");// Оттесняет другие сверху
               
            // Создаем меню
            MenuStrip menu = new MenuStrip();
            this.Controls.Add(menu);// Другой способ
            menu.Items.Add("menu");// Оттесняет другие сверху
    
            // Создаем панель состояния
            StatusStrip status = new StatusStrip();
            status.Parent = this;// Один способ
            status.Items.Add("status");// Оттесняет другие снизу
        }
    }
    
    // Запуск
    class Program
    {
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.Run(new MyClass());
        }
    }
}
Листинг 16.4 . Применение панелей в качестве контейнеров компоновки

Результат выполнения будет таким


Теперь между деревом и текстом есть изменяемая граница шириной 4 пиксела по умолчанию (задается свойством SplitterWidth ). Когда меняются размеры окна, то и размеры панелей, составляющих объект класса SplitContainer, тоже пропорционально меняются. Чтобы отключить автоматическое изменение одной из панелей, нужно задать свойству SplitContainer.FixedPanel одно из значений Panel1 или Panel2 одноименного перечисления FixedPanel (по умолчанию установлено значение None ).

Стыковка с применением составных разделителей

Можно создавать более сложные панельные разделители, помещая внутрь составляющих панелей новые объекты SplitContainer и делая составляющие панели родительскими для этих элементов. Подобным образом построено окно Object Browser оболочки. Например

using System;
using System.Drawing;
using System.Windows.Forms;
    
namespace Test
{
    // Класс приложения
    class MyClass : Form
    {
        public MyClass()
        {
        this.Text = "Составные разделители";
    
        // Создаем родительский двухпанельный элемент
        SplitContainer splitParent = new SplitContainer();
        splitParent.Parent = this;// Привязали к форме
        splitParent.Dock = DockStyle.Fill;
        splitParent.Orientation = Orientation.Vertical;
        splitParent.SplitterWidth = 2;// Толщина разделителя
    
        // Создаем объект дерева в левой панели
        TreeView tree = new TreeView();
        splitParent.Panel1.Controls.Add(tree);// Привязали к левой панели
        tree.Dock = DockStyle.Fill;// Распахнули
        tree.Nodes.Add("tree");// Добавили узел
    
        // В правую панель помещаем дочерний двухпанельный элемент
        SplitContainer splitChild = new SplitContainer();
        splitChild.Parent = splitParent.Panel2;
        splitChild.Dock = DockStyle.Fill;
        splitChild.Orientation = Orientation.Horizontal;
        splitChild.SplitterWidth = 2;// Толщина разделителя
        // Позиционируем разделитель как 2/3 к 1/3 от верха
        splitChild.SplitterDistance = splitChild.Size.Height
                - splitChild.Size.Height / 3;
    
        // Создаем многострочный TextBox в верхней дочерней панели
        TextBox textBox1 = new TextBox();
        textBox1.Parent = splitChild.Panel1; // Привязали
        textBox1.Multiline = true;
        textBox1.Dock = DockStyle.Fill;// Распахнули
        // Задаем начальный текст
        textBox1.Text = "Буря мглою небо кроет" + 
    Environment.NewLine
                + "Вихри снежные крутя" + Environment.NewLine
                + "То как зверь она завоет\r\n"
                + "То заплачет как дитя\r\n\r\n";
        textBox1.WordWrap = false;// Отключаем перенос слов
    
        // Создаем многострочный TextBox в нижней дочерней панели
        TextBox textBox2 = new TextBox();
        textBox2.Parent = splitChild.Panel2; // Привязали
        textBox2.Multiline = true;
        textBox2.Dock = DockStyle.Fill;// Распахнули
        // Задаем начальный текст
        textBox2.Text = "Привет всем!";
        textBox2.WordWrap = false;// Отключаем перенос слов
    
        // Создаем панель инструментов
        ToolStrip tool = new ToolStrip();
        this.Controls.Add(tool);
        tool.Items.Add("tool");// Оттесняет другие сверху
    
        // Создаем меню
        MenuStrip menu = new MenuStrip();
        this.Controls.Add(menu);// Другой способ
        menu.Items.Add("menu");// Оттесняет другие сверху
    
        // Создаем панель состояния
        StatusStrip status = new StatusStrip();
        status.Parent = this;// Один способ
        status.Items.Add("status");// Оттесняет другие снизу
        }
    }
    
    // Запуск
    class Program
    {
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.Run(new MyClass());
        }
    }
}
Листинг 16.5 . Применение составных разделительных панелей

Вот результат


Теперь пользователь может интерактивно менять вертикальную и горизонтальную границы панелей.

Максим Филатов
Максим Филатов

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

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

 

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