Опубликован: 25.03.2010 | Уровень: для всех | Доступ: платный
Лекция 6:

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

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

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

Вот код программы

using System;
using System.Windows.Forms;
using System.Drawing;
    
namespace MyApp
{
    class ModelessDialogBox : Form
    {
        // Локальное поле ссылки на флажок
        CheckBox cbGrayShades;
    
        // Объявляем события для главной формы
        public event EventHandler Change;
        public event EventHandler DialogClosed;
    
        // Конструктор
        public ModelessDialogBox()
        {
            // Настройка диалогового окна
            // Заголовок назначения окна
            this.Text = "Цвет формы";
            // Неизменяемый размер
            this.FormBorderStyle = FormBorderStyle.FixedDialog;
            // Отключим все системные кнопки в заголовке окна
            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.Size = new Size(48, 14);// Размеры кнопки
            left = (this.ClientSize.Width - btn.Width) / 2;
            btn.Location = new Point(left, 32);// Позиционирование в окне
            btn.Click += ButtonOnClick; // Изменить цвет
            this.AcceptButton = btn; // Закрепили за клавишей Enter, когда в фокусе
    
            // Автоматическое масштабирование под опорный шрифт
            this.AutoScaleDimensions = new Size(4, 8);
            this.AutoScaleMode = AutoScaleMode.Font;
        }
    
        void ButtonOnClick(object sender, EventArgs e)
        {
            // Послать сообщение об изменении цвета
            if (this.Change != null)
                Change(this, new EventArgs());
                //Change(this, e);
        }
    
        // Для тренировки обертываем открытое свойство 
        // состояния флажка своим открытым свойством
        public bool GrayShades
        {
            get { return cbGrayShades.Checked; }
            set { cbGrayShades.Checked = value; }
        }
    
        // Послать сообщение главной форме при закрытии
        protected override void OnClosed(EventArgs e)
        {
            // Аргументы нам не нужны, создаем однотипные затычки
            this.DialogClosed(new Object(), new EventArgs());
            // Пусть закроется как надо!
            base.OnClosed(e);
        }
    }
}
Листинг 6.26 . Код файла ModelessDialogBox.cs немодального диалогового окна
using System;
using System.Windows.Forms;
using System.Drawing;
    
namespace MyApp
{
    class GeneralForm : Form // Наследуем библиотечному классу
    {
        ModelessDialogBox dlg = null;// Храним ссылку на окно
        Random rnd = new Random();// Поле
    
        // Конструктор с настройками
        public GeneralForm()
        {
            // Начальная настройка окна
            this.Text = "С немодальным окном";
            this.StartPosition = FormStartPosition.CenterScreen;
    
            // Создание и настройка объекта кнопки
            Button btn = new Button(); // Кнопка вызова диалогового окна
            btn.Parent = this;  // Назначаем родителя
            btn.Text = "Изменить цвет";// Надпись на кнопке
            btn.AutoSize = true;// Подгонять размер под надпись
            int left = (this.ClientSize.Width - btn.Width) / 2;
            int top = this.ClientSize.Height - 2 * btn.Height;
            btn.Location = new Point(left, top); // Координаты привязки
            // Подписываемся на событие
            btn.Click += ButtonOnClick;
    
            // Автоматическое масштабирование под конкретное разрешение
            this.AutoScaleDimensions = new Size(96, 96);
            this.AutoScaleMode = AutoScaleMode.Dpi;
        }
    
        // Обработчик создает диалоговое окно
        void ButtonOnClick(object sender, EventArgs e)
        {
            // Создать диалоговое окно
            if (dlg == null)
                dlg = new ModelessDialogBox();
    
            // Назначить владельца и расположить поверх окна приложения
            dlg.Owner = this;
            // Слушать события диалогового окна
            dlg.Change += new EventHandler(DialogOnChange);
            dlg.DialogClosed += DialogOnClosed;
            // Отобразить диалоговое окно
            dlg.Show();
        }
    
        void DialogOnChange(object sender, EventArgs e)
        {
            // Приводим тип переданной ссылки,
            // адресующей объект диалогового окна
            dlg = (ModelessDialogBox)sender;
    
            // Изменяем цвет главной формы
            if (dlg.GrayShades)
            {
                int iShade = rnd.Next(255);
                this.BackColor = Color.FromArgb( // Только случайный серый
                    iShade,
                    iShade,
                    iShade);
            }
            else
            {
                this.BackColor = Color.FromArgb( // Случайный цветной 
                    rnd.Next(255),
                    rnd.Next(255),
                    rnd.Next(255));
            }
        }
    
        void DialogOnClosed(object sender, EventArgs e)
        {
            dlg = null;
        }
    }
}
Листинг 6.27 . Код файла GeneralForm.cs главного окна приложения
using System.Windows.Forms;
    
namespace MyApp
{
    class EntryPoint
    {
        public static void Main()
        {
            Application.EnableVisualStyles();
            Application.Run(new GeneralForm());
        }
    }
}
Листинг 6.28 . Код файла Program.cs
Максим Филатов
Максим Филатов

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

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

 

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

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