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

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

Упаковка классов пользователя в DLL - библиотеки

Динамически подключаемые библиотеки ( DLL - Dynamic Link Library ) являются наилучшим способом упаковки отлаженного и откомпилированного кода, который может вызываться приложением по мере необходимости. Сейчас в Visual Studio 2005 это сделать очень просто, стоит лишь установить командой Project/Properties/Application опцию Output type=Class Lybrary в свойствах проекта.

В прошлом упражнении мы создали немодальное диалоговое окно с именем класса ModelessDialogBox, еще раньше был создан код модального диалогового окна ModalDialogBox. Оба окна применялись для изменения цвета главной формы приложения. Попробуем упаковать эти классы в библиотечную динамическую сборку MyLibrary в пространстве имен DialogBox. Попутно рассмотрим работу оболочки, когда решение содержит несколько проектов.

  • С помощью команды меню File/New/Project вызовите окно мастера создания новых проектов и заполните его так

Мастер создаст необходимые вспомогательные файлы решения и проекта и разместит их в цепочке каталогов


  • В панели Solution Explorer вызовите контекстное меню для узла проекта MyLibrary и выберите опцию Properties
  • Настройте вкладку Application как показано на снимке

Теперь при добавлении файлов в проект оболочка по умолчанию будет упаковывать код в пространство имен DialogBox и при компиляции создавать сборку DLL с именем MyLibrary.

  • Командой Project/Add Reference вызовите диалоговое окно оболочки и добавьте к проекту ссылки на библиотечные сборки System.dll, System.Windows.Forms.dll и System.Drawing.dll

  • Добавьте к проекту два пустых файла с любым именем командой Proiect/Add New Item

  • Скопируйте в них коды классов модального и немодального диалоговых окон, разработанные нами ранее, измените модификаторы доступа классов на public и объявление пространства имен на DialogBox

Объявление классов общедоступными требуется для того, чтобы они были видимы коду, расположенному в других сборках. Собственно, для библиотечных классов, которые предполагается использовать из внешних сборок, это требование характерно всегда.

using System;
using System.Windows.Forms;
using System.Drawing;
    
namespace DialogBox
{
    public 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.29 . Код класса ModalDialogBox файла CodeFile1.cs
using System;
using System.Windows.Forms;
using System.Drawing;
    
namespace DialogBox
{
    public 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.30 . Код класса ModelessDialogBox файла CodeFile2.cs
  • Установите опцию Solution Configurations в значение Release (окончательный вариант) и выполните команду Build/Build MyLibrary

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

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

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

 

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