Опубликован: 25.03.2010 | Уровень: для всех | Доступ: платный
Лекция 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. Ввожу код на сайте, пишет:

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

 

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

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