Опубликован: 25.03.2010 | Доступ: свободный | Студентов: 1447 / 157 | Оценка: 4.31 / 4.00 | Длительность: 25:42:00
Лекция 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. Ввожу код на сайте, пишет:

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

 

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