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

Класс Control и стандартные элементы управления (обзор)

Привязка и размер дочерних элементов

Каждому элементу управления может задаваться положение его левого верхнего угла относительно левого верхнего угла клиентской области родителя. Оно определяется свойством Location элемента управления, которое ожидает ссылку на экземпляр класса Point(x, y), где x и y означают количество пикселов смещения. Размер элемента задается через свойство Size, которое ожидает ссылку на объект класса Size(width, height). Ширина и высота также означают количество пикселов относительно точки привязки элемента управления.


Если в элементе управления (например, кнопке) установить булево свойство AutoSize = true, то установленный размер Size игнорируется и элемент управления подгоняет свои размеры под размер надписи, определяемой свойством Text.

Свойство Dock (причал) элемента управления используется для растягивания и выравнивания по внутренней стороне родителя. Его значение определяется перечислением DockStyle: None, Left, Right, Top, Bottom, Fill. Свойство Anchor (якорь) заставляет элемент управления замораживать привязку к сторонам родителя (при изменении размеров последнего) на том расстоянии, которое он занимал до изменения размеров родителя. Свойство Anchor принимает значения перечисления AnchorStyles: : None, Left, Right, Top, Bottom и допускает их побитовое сложение ( по умолчанию Anchor = Left | Top).

Шрифт и цвет дочерних элементов

Порядок создания объектов в программе следующий: вначале создается главный контейнер, затем создаются все дочерние элементы и присоединяются к контейнеру через ссылки. Если дочерний элемент, в свою очередь, является контейнером, то он создается вперед своих дочерних элементов и ждет, когда к нему будут присоединены ссылки на них. При создании дочерних элементов им неявно передаются значения одноименных свойств контейнера. Главный контейнер приложения получает значения этих свойств от операционной системы и передает их вниз по иерархической цепочке. Если в любом контейнере этой цепочки свойствам назначить другие значения, то новые значения одноименных свойств получат все дочерние элементы.

Класс Color передает элементам управления свойство Text, которые используют его соответствующим их специализации способом. Например, в форме это заголовок окна, в кнопке это надпись, а полоса прокрутки вообще не использует это свойство. Наследники класса Control получают от него, также, свойства Font, ForeColor и BackColor, которые задают шрифт, его размер, стиль и цвет, а также цвет клиентской области. Если дочерний элемент явно не задает значение этого свойства, то оно перенимает значение контейнера.

Для иллюстрации сказанного переделаем предыдущий пример.

  • Замените в последнем проекте MyProject код файла MainForm.cs на следующий
using System;
using System.Windows.Forms;
using System.Drawing;
    
namespace MyProject
{
    class MainForm : Form
    {
        const int MAX_BUTTON = 5;   // Число кнопок
    
        public MainForm()
        {
            // Настраиваем консольное окно
            Console.ForegroundColor = ConsoleColor.White;
    
            // Регистрируем событие загрузки формы
            this.Load += new EventHandler(MainForm_Load);
        }
    
        // Создаем элементы управления в обработчике события Load формы
        void MainForm_Load(object sender, EventArgs e)
        {
            this.Text = "Щелкайте на кнопках!";
            // Автоматически показывать полосу прокрутки,
            // когда не помещаются дочерние элементы
            this.AutoScroll = true;
            // При запуске с консольным окном сделать верхней
            this.Activate();
    
            // Переопределяем свойство контейнера,
            // которое неявно передастся дочерним элементам
            this.ForeColor = Color.Red;
    
            // Создаем и настраиваем дочерние элементы
            int x = 0, y = 0; // Размещение кнопок
            for (int i = 0; i < MAX_BUTTON; i++)
            {
                Button btn = new Button();  // Создали кнопку
                btn.Click += btn_Click;// Зарегистрировали общий обработчик
                btn.Parent = this;  // Отдали форме
                // Продолжаем настройку, пока не потеряли адрес
                btn.Text = "Кнопка " + (i + 1).ToString();
                btn.AutoSize = true;
                // Настраиваем плоский стиль кнопки (для Flat)
                btn.FlatStyle = FlatStyle.Flat;
                btn.FlatAppearance.BorderColor = Color.Blue;
                btn.FlatAppearance.BorderSize = 5; // В пикселах
                // Вычисляем точку размещения
                if ((i + 3) % 2 == 1) // Первая колонка нечетные
                {
                    x = 0;
                    if (i != 0)// Начальные не смещать
                        y += btn.Size.Height * 2;
                }
                else // Вторая колонка четные
                {
                    x = btn.Size.Width * 2;
                    btn.TabStop = false; // Четные лишаем фокуса ввода 
                }
                // Позиционируем дочерний элемент относительно родителя
                btn.Location = new Point(x, y);
                // Переопределяем свойство дочернего элемента.
                // Стиль шрифта побитово суммируем
                btn.Font = new System.Drawing.Font(
                    "Times New Roman", 14,
                    FontStyle.Italic | FontStyle.Bold);
                btn.BackColor = Color.Yellow;
            }
    
            // Назначение фокуса ввода
            int indexFocus, count = this.Controls.Count;
            indexFocus = (count + 2) % 2 == 1 ? count - 1 : count;
            if (indexFocus >= 0) // Проверка на случай пустого контейнера
                this.Controls[indexFocus].Focus(); 
    // Активируем последний в первой колонке
    
            Console.WriteLine("Создано кнопок: 
    {0}", this.Controls.Count);
        }
    
        // Уничтожение пользователем кнопок интерактивно
        void btn_Click(object sender, EventArgs e)
        {
            Control ctrl = sender as Control;
            this.Controls.Remove(ctrl);
            Console.WriteLine("\"" + 
    ctrl.Text + "\" удалена!");
            // Меняем заголовок окна, когда кончились кнопки
            if (this.Controls.Count == 0)
            {
                this.Text = "Все кнопки удалены !!!!!!";
            }
        }
    }
}
Листинг 13.3 . Измененный код файла MainForm.cs

Графическое окно, созданное классом-контейнером MainForm, будет выглядеть так


Цвет надписи кнопка получила от родителя, а шрифт и цвет фона были для нее установлены явно. Обратите внимание на то, как мы программно установили для коллекции дочерних элементов фокус ввода и порядок управления фокусом ввода по клавише Tab. Кнопка, имеющая фокус ввода, реагирует на нажатие клавиш Enter или Space ( пробела - такая са-а-амая длинная!) как на щелчок мыши.

  • Запустите и опробуйте это ...
Максим Филатов
Максим Филатов

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

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

 

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