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

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

 

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