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

Создание оконных приложений Windows Forms

Диалоговые окна

Диалоговые окна служат для получения приложением необходимой информации от пользователя. Чаще всего диалоговые окна вызываются командой меню, заканчивающейся многоточием, или кнопками панели управления. Различают модальные и немодальные диалоговые окна. Модальное окно не дает продолжить работу приложения, пока не будет закрыто. Немодальное окно позволяет пользователю переключаться на другие режимы работы приложения без его закрытия, но визуально всегда расположено поверх приложения.

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

На случай использования формы для разработки диалогового окна в ней предусмотрены методы Show() и ShowDialog(), а также свойство DialogResult. Свойство с таким же именем DialogResult есть и у кнопок на случай их использования в диалоговых окнах. Если в обработчике события Click кнопки предусмотреть присвоение его свойству DialogResult одного из значений одноименного перечисления, то свойству DialogResult формы, а также ее возвращаемому значению, будет присвоено это значение.

Среди множества свойств, наследуемых и своих, класс Form имеет свойства AcceptButton и CancelButton, которым можно присвоить ссылки на объекты кнопок, по умолчанию предназначенных на реагирование нажатий клавиш Enter и Esc соответственно. Если упомянутые свойства для формы установлены, то нажатие клавиши Esc равносильно щелчку на соответствующей кнопке Cancel. Нажатие клавиши Enter равносильно щелчку на кнопке OK при условии, что другая кнопка в это время не имеет фокуса ввода.

И еще разок, когда диалоговое окно закроется, оно продолжает существовать и сохраняет свое состояние до тех пор, пока не будет потеряно при выходе своей ссылочной переменной за пределы области видимости. После этого мы уже не сможем адресоваться к такому окну и оно достанется сборщику мусора как брошенная память. Заголовок диалогового окна должен соответствовать запрашиваемой от пользователя информации.

Модальные диалоговые окна

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

Вот код примера конструирования нашего диалогового окна, иллюстрирующий все сказанное.

  • Добавьте к приложению пустой файл с именем ModalDialogBox.cs, выполнив команду Project/Add New Item
  • Заполните файл следующим кодом
using System;
using System.Windows.Forms;
using System.Drawing;
    
namespace MyApp
{
    class ModalDialogBox : Form
    {
        // Локальное поле ссылки на флажок
        CheckBox cbGrayShades;
    
        // Конструктор
        public ModalDialogBox()
        {
            // Настройка диалогового окна
            // Заголовок назначения окна
            this.Text = "Цвет формы";
            // Неизменяемый размер
            this.FormBorderStyle = FormBorderStyle.FixedDialog;
            // Отключим все системные кнопки в заголовке окна
            this.ControlBox = false; // Значок слева и кнопка закрытия справа
            this.MinimizeBox = false;// Кнопка свертывания
            this.MaximizeBox = false;// Кнопка развертывания
            // Не отображать кнопку в панели задач
            this.ShowInTaskbar = false; // Нет внизу экрана
            // Появление формы при каждом запуске 
            // определяется нами свойством Location
            this.StartPosition = FormStartPosition.Manual;
            // Размер клиентской области окна
            this.ClientSize = new Size(144, 56);
            // Позиция диалогового окна
            this.Location =
                ActiveForm.Location // Координаты вызывающего окна
                // Добавляем сдвиг вправо-вниз относительно вызывающего окна
              + SystemInformation.CaptionButtonSize // Размер надписи кнопки
              + SystemInformation.FrameBorderSize;  // Толщина рамки 
    
            // Создаем и настраиваем флажок
            // Создали объект
            cbGrayShades = new CheckBox();
            // Назначили родителя
            cbGrayShades.Parent = this;
            // Смысловая надпись для включенного состояния
            cbGrayShades.Text = "Только случайный серый";
            // Привязка левого-верхнего угла относительно родителя
            int left, top; // Вспомогательные переменные
            left = 16; top = 8;
            cbGrayShades.Location = new Point(left, top);
            // Ширина - высота в пикселах
            cbGrayShades.Size = new Size(this.ClientSize.Width - left - 4, 12);
    
            // Создаем и настраиваем две кнопки
            Button btn = new Button();
            btn.Parent = this;
            btn.Text = "OK";
            btn.Location = new Point(16, 32);// Копируем значение структуры
            btn.Size = new Size(48, 14);// Копируем значение структуры
            btn.DialogResult = DialogResult.OK;// Пометили признаком "ПРИНЯТЬ"
            this.AcceptButton = btn; // Закрепили за клавишей Enter, когда в фокусе
    
            btn = new Button(); // Используем ту же ссылочную переменную
            btn.Parent = this;
            btn.Text = "Cancel";
            btn.Location = new Point(80, 32);// Правее первой кнопки
            btn.Size = new Size(48, 14);// Тот же размер
            btn.DialogResult = DialogResult.Cancel;// Пометили признаком "ОТМЕНИТЬ"
            this.CancelButton = btn; // Закрепили за клавишей Esc
    
            // Автоматическое масштабирование под опорный шрифт
            this.AutoScaleDimensions = new Size(4, 8);
            this.AutoScaleMode = AutoScaleMode.Font;
        }
    
        // Для тренировки обертываем открытое свойство 
        // состояния флажка своим открытым свойством
        public bool GrayShades
        {
            get { return cbGrayShades.Checked; }
            set { cbGrayShades.Checked = value; }
        }
    }
}
Листинг 6.19 . Код файла ModalDialogBox.cs

Хотя свойство ControlBox ссылается на значок системного меню слева в строке заголовка, но скрывается заодно и кнопка закрытия окна. Если ControlBox задать значение true, то при значении FormBorderStyle = FormBorderStyle.FixedDialog появится только кнопка закрытия.

  • Откорректируйте файл MyForm.cs реализации основного окна приложения так
using System;
using System.Windows.Forms;
using System.Drawing;
    
namespace MyApp
{
    class MyForm : Form // Наследуем библиотечному классу
    {
        // Конструктор с настройками
        public MyForm()
        {
            // Начальная настройка окна
            this.Text = "С модальным окном";
            this.StartPosition = FormStartPosition.CenterScreen;
        
            // Создание и настройка объекта кнопки
            Button btn = new Button(); // Кнопка вызова диалогового окна
            btn.Parent = this;  // Назначаем родителя
            btn.Text = "Изменить цвет";// Надпись на кнопке
            int left = (this.ClientSize.Width - btn.Width) / 2;
            int top = this.ClientSize.Height - 2 * btn.Height;
            btn.Location = new Point(left, top); // Координаты привязки
            btn.AutoSize = true;// Подгонять размер под надпись
            // Подписываемся на событие
            btn.Click += ButtonOnClick;
        }
    
        // Обработчик создает диалоговое окно
        void ButtonOnClick(object sender, EventArgs e)
        {
            // Создаем объект модального окна,
            // локальный внутри обработчика 
            // Он будет заново создаваться при каждом вызове
            ModalDialogBox dlg = new ModalDialogBox();
    
            if (dlg.ShowDialog() == DialogResult.OK)// Надо изменить цвет
            {
                Random rnd = new Random();
                int iShade = rnd.Next(255);
    
                // Проверяем выбор пользователя по состоянию флажка
                // Форма еще существует, хоть и скрыта после завершения
                if (dlg.GrayShades)
                {
                    this.BackColor = Color.FromArgb( // Только случайный серый
                        iShade,
                        iShade,
                        iShade);
                }
                else
                {
                    this.BackColor = Color.FromArgb( // Случайный цветной 
                        iShade,// Уже сгенерировано, экономим силы
                        rnd.Next(255),
                        rnd.Next(255));
                }
            }
        }
    }
}
Листинг 6.20 . Код файла MyForm.cs

Файл создания объекта формы приложения останется прежним и будет таким

using System.Windows.Forms;
// Лишние пространства имен удалили
    
namespace MyApp
{
    class EntryPoint
    {
        public static void Main()
        {
            Application.EnableVisualStyles();
            Application.Run(new MyForm());
        }
    }
}
Листинг 6.21 . Код файла Program.cs
Максим Филатов
Максим Филатов

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

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

 

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