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

Классы Application и Form

Собственные функциональные возможности класса Form

Класс Form добавляет к унаследованным свои свойства, методы и события. Рассмотрим некоторые из них.

Таблица 12.6 . Некоторые добавленные свойства класса Form
Свойство Описание
AcceptButton Содержит ссылку на кнопку формы, которая откликнется на нажатие клавиши Enter
ActiveForm Содержит ссылку на текущую активную форму приложения
ActiveMdiChild, IsMdiChild, IsMdiContainer Используется в MDI - приложениях
CancelButton Содержит ссылку на кнопку формы, которая откликнется на нажатие клавиши Esc
ControlBox Управляет системной кнопкой закрытия окна и наличием системного меню
FormBorderStyle Задает стиль границы формы из перечисления FormBorderStyle
Menu Ссылается на MainMenu формы, если оно есть
MaximizeBox, MinimizeBox Управляют кнопками сворачивания и разворачивания формы
ShowInTaskbar Флаг видимости формы в панели задач операционной системы
StartPosition Задает начальную позицию окна формы из перечисления FormStartPosition
WindowState Определяет вид формы согласно перечислению FormWindowState

Таблица 12.7 . Некоторые добавленные методы класса Form
Метод Описание
Activate() Активизирует форму и предоставляет ей фокус ввода
Close() Закрывает форму
CenterToScreen() Размещает форму в центре экрана
LayoutMdi() Размещает все дочерние формы в рамках родительской формы в соответствии с перечислением MdiLayout
ShowDialog() Отображает форму в виде модального диалогового окна

Таблица 12.8 . Некоторые добавленные события класса Form
Событие Описание
Activated Форма получила фокус ввода
FormClosing, FormClosed Форма закрывается ( FormClosing ) или уже закрылась ( FormClosed )
Deactivate Форма утратила текущий фокус ввода
Load Форма разместилась в памяти, но еще не отобразилась
MdiChildActivate Активизировалось дочернее окно

Цикл существования объекта класса Form

Жизнь формы начинается тогда, когда вызывается ее конструктор, перед его передачей методу Application.Run(). После размещения объекта в динамической памяти среда генерирует событие Load. В обработчике события Load можно настроить вид и поведение формы, подготовить содержащиеся в форме дочерние элементы управления, организовать доступ к ресурсам, необходимым для работы формы - то есть все то, что можно сделать в конструкторе формы.

Следующим генерируется событие Activated (активизированный). Оно генерируется тогда, когда форма получает фокус ввода. При потере формой фокуса ввода генерируется событие Deactivate. То и другое события происходят всякий раз, когда пользователь переходит от одного приложения рабочего стола к другому.

Пара событий FormClosing и FormClosed генерируются, когда пользователь хочет закрыть форму. Событие FormClosing генерируется первым и дает возможность спросить пользователя, действительно ли он хочет покинуть приложение. Оно работает в паре с делегатом System.ComponentModel.FormClosingEventHandler, определяющим в качестве аргумента экземпляр класса System.ComponentModel.FormClosingEventArgs со свойством Cancel. Если в обработчике установить для этого свойства значение true, форма не закроется и возвратится к нормальному состоянию. Если установить значение false, то форма будет закрыта и сгенерируется событие FormClosed.

Для проверки сказанного приведем пример.

  • Измените в проекте MyEventHandler код файла GeneralForm.cs на следующий
using System;
using System.Windows.Forms;
using System.Drawing;
    
using System.ComponentModel;
using EnumDialogResult = System.Windows.Forms.DialogResult;
    
namespace MyEventHandler
{
    class GeneralForm : Form
    {
        string lifeTimeInfo = "";   // Вспомогательное поле
        
        public GeneralForm()
        {
            // Подписка на события
            this.FormClosing += new FormClosingEventHandler(OnClosing);
            this.Load += new EventHandler(OnLoad);
            this.FormClosed += new FormClosedEventHandler(OnClosed);
            this.Activated += new EventHandler(OnActivated);
            this.Deactivate += new EventHandler(OnDeactivate);
        }
    
        void OnClosing(object sender, FormClosingEventArgs e)
        {
            EnumDialogResult result;
            result = MessageBox.Show(
                "Вы действительно хотите закрыть приложение?",
                "Событие Closing формы", 
                MessageBoxButtons.YesNo);
            if (result == EnumDialogResult.No)
                e.Cancel = true;
            else
            {
                e.Cancel = false;// Продолжить закрытие
                this.Hide();// Скрыть форму до закрытия
            }
            lifeTimeInfo += "Произошло событие Closing\n";
        }
    
        void OnLoad(object sender, EventArgs e)
        {
            lifeTimeInfo += "Произошло событие Load\n";
        }
    
        void OnClosed(object sender, FormClosedEventArgs e)
        {
            lifeTimeInfo += "Произошло событие Closed";
            MessageBox.Show(lifeTimeInfo, "Отчет о событиях");
        }
    
        void OnActivated(object sender, EventArgs e)
        {
            lifeTimeInfo += "Произошло событие Activated\n";
        }
    
        void OnDeactivate(object sender, EventArgs e)
        {
            lifeTimeInfo += "Произошло событие Deactivate\n";
        }
    }
}
Листинг 12.7 . Код файла GeneralForm.cs

Результат выполнения будет таким


Формы класса System.Windows.Forms.Form

Консольное приложение - когда программа создает единственное окно ввода-вывода и принимает ввод только с клавиатуры (консольный ввод), а вывод - экран или принтер.

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

Библиотека классов позволяет создавать консольные- и Widows-приложения. Причем проект одновременно может содержать и те и другие. Тип проекта определяется настройками компилятора через оболочку VS.NET


Настройка заставляет компилятор помечать приложение определенным флажком, показывающим операционной системе, как нужно загружать и выполнять приложение. Если исполняемый файл помечен как консольное приложение, Windows при запуске приложения создает окно командной строки, в котором программа запускается и выводит информацию "строка за строкой".

Если исполняемый файл помечен как приложение Windows, то окно командной строки не создается и программа ничего не выводит на консоль. Но разработчик может разрабатывать Widows -приложение как консольное для удобства отладки, поскольку в такой программе он может использовать операторы вывода, чтобы узнать состояние переменных в любом месте (вместо класса System.Diagnostics.Debug ). При этом отладочная информация будет выводиться в окно командной строки. На завершающем этапе перед представлением заказчику следует убрать все консольные операторы и перекомпилировать проект как Windows -приложение.

Создание заготовки Windows-приложения для написания кода вручную

Написание кода вручную с нуля - наш лозунг на этапе обучения !!!

Мы для изучения C# будем стремиться писать код вручную и нам понадобятся пространства имен как минимум

using System;
using System.Windows.Forms;
using System.Drawing;

Можно вводить свои псевдонимы пространства имен, например

using SYSTEM = System;
using FORMS = System.Windows.Forms;
using DRAWING = System.Drawing;

Для поддержки проектов в ссылках компилятора должны быть ссылки на одноименные библиотеки.

  • Создайте пустое решение с именем Application

  • Добавьте новый проект

  • Тип проекта C#, имя FirstProject, пустой проект ( Empty Project ), чтобы мастер не генерировал никакой код

  • Добавьте к проекту ссылки на библиотеки, необходимые компилятору

Добавим самый минимум необходимых библиотек

System.dll
System.Drawing.dll
System.Windows.Forms.dll

После щелчка на кнопке OK в окне Solution Explorer появятся добавленные ссылки на соответствующие библиотеки


  • Добавьте пустой класс к проекту

выбрав шаблон Class и задав имя ShowForm


Мастер сгенерирует код заготовки класса

using System;
  
namespace FirstProject
{
  /// 
  /// Summary description for ShowForm.
  /// 
  public class ShowForm
  {
    public ShowForm()
    {
      //
      // TODO: Add constructor logic here
      //
    }
  }
}
Листинг 12.8 . Заготовка класса C#
  • Попробуем откомпилировать проект и мы получим ошибку, что в приложении нет точки входа
Program 'FirstProject.exe' does not have an entry point defined
(Программе 'FirstProject.exe' не определяли точку входа)

Точкой входа в приложение Windows Forms C# является функция Main(). Эта функция обязательно должна быть членом любого класса (метод Main ), поскольку глобальных функций в C# нет. Она обязательно должна быть статической.

Таблица 12.9 . Варианты метода Main()
static void Main(string[] args) {...}
public static void Main(string[] args) {...}
public static void Main() {...}
private static void Main(string[] args) {...}
private static void Main() {...}
static int Main(string[] args) {... return 0; }
public static int Main(string[] args) {... return 0; }
public static int Main() {... return 0; }
private static int Main(string[] args) {... return 0; }
private static int Main() {... return 0; }
  • Добавим в приложение функцию Main()
using System;
  
namespace FirstProject
{
  public class ShowForm
  {
  public ShowForm()
  {
  }
  static void Main()
  {
  }
  }
}
Листинг 12.9 . Пустая точка входа

При запуске приложения система создаст пустое окно консольного вывода и завершит работу. Если выполнить запуск командой Debug/Start Without Debugging (Ctrl+F5), то приложение будет ждать нажатия любой клавиши, затем завершится.

В традиционных Windows -приложениях окна называются окнами, а в .NET - формами (аналогично исполнимый файл и сборка ). Для создания формы понадобится класс

System.Windows.Forms.Form

Этот класс является наследником целой цепочки классов, которую можно увидеть в окне Object Browser


Кстати, в C# разрешено только одиночное наследование, а множественное наследование, как это принято в C++,- запрещено.

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

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

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

 

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