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

Классы Application и Form

Отображение простой формы

Создадим в функции Main объект формы и отобразим его с помощью следующего кода

using System;
  
namespace FirstProject
{
  public class ShowForm
  {
    public ShowForm()
    {
    }
  
    static void Main()
    {
    System.Windows.Forms.Form frm;
    frm = new System.Windows.Forms.Form();
    frm.Show();
  
    frm.Text = "Ждем 5 секунд";
    System.Threading.Thread.Sleep(5000);
  
    frm.Text = "Ждем еще 5 секунд";
    System.Threading.Thread.Sleep(5000);
    }
  }
}
Листинг 12.10 . Код создания и отображения формы

Здесь мы применили для фиксации формы статический метод Sleep класса потока Thread.Sleep(), приостанавливающий выполнение потока (программы, загруженной в оперативную память) на указанное в аргументе количество миллисекунд. Обратите внимание, форма есть, но она не получает фокуса ввода и с ней ничего нельзя сделать.

Использование статического метода класса Application

Чтобы оживить форму, ее нужно включить в поток как управляемую циклом сообщений Windows. Дополним код статическим методом класса System.Windows.Forms.Application

using System;
  
namespace FirstProject
{
  public class ShowForm
  {
  public ShowForm()
  {
  }
  
  static void Main()
  {
  System.Windows.Forms.Form frm;
  frm = new System.Windows.Forms.Form();
  frm.Show();
  frm.Text = "Ждем 5 секунд";
  System.Threading.Thread.Sleep(5000);
  
  frm.Text = "Ждем еще 5 секунд";
  System.Threading.Thread.Sleep(5000);  
  
  frm.Text = "Находимся в цикле сообщений";
  System.Windows.Forms.Application.Run();
  }
  }
}
Листинг 12.11 . Код формы с циклом сообщений

Запустите приложение и убедитесь, что при закрытии формы консольное окно не закрывается. Это потому, что мы неправильно применили метод Run. При таком подходе форма считается дочерней по отношению к родительскому консольному окну, поскольку приложение объявлено как консольное. Объект формы нужно включить в метод Run как параметр. Новый код

static void Main()
{
System.Windows.Forms.Form frm;
frm = new System.Windows.Forms.Form();
  
frm.Text = "Находимся в цикле сообщений";
System.Windows.Forms.Application.Run(frm);
}
Листинг 12.12 . Включение объекта формы как параметра метода Run()

Теперь нет необходимости специально рисовать форму методом Show() и при закрытии форма отправляет в главный цикл процесса сообщение о завершении приложения, поэтому закрываются оба окна.

Добавление пространств имен для сокращения имен классов

Добавим в начало файла пространства имен, чтобы в именах файлов не указывать полные пути. Ненужное пространство имен пока закомментируем.

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

Код проекта будет выглядеть так

using System;
using System.Windows.Forms;
//using System.Drawing;
  
namespace FirstProject
{
public class ShowForm
{
public ShowForm()
{
}
  
static void Main()
{
Form frm;
frm = new Form();
    
frm.Text = "Находимся в цикле сообщений";
Application.Run(frm);
}
}
}
Листинг 12.13 . Код проекта с сокращенными именами классов

Пример с двумя формами: свободной и в цикле сообщений

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

using System;
using System.Windows.Forms;
//using System.Drawing;
  
namespace FirstProject
{
public class ShowForm
{
public ShowForm()
{
}
  
static void Main()
{
Form child = new Form(); // Ребенок
child.Text = "Дочерняя форма";
child.Show();
  
Form parent = new Form(); // Родитель
parent.Text = "Главная форма (в цикле сообщений)";
Application.Run(parent);
  
MessageBox.Show("Цикл сообщений формы завершен."
  + "\nУправление передано функции Main()",
  "Информационное окно MessageBox",
  MessageBoxButtons.OK,
  MessageBoxIcon.Information);
}
}
}
Листинг 12.14 . Пример отношений главной и дочерней форм
Максим Филатов
Максим Филатов

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

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

 

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

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