- •Основы создания оконных приложений Особенности поведения оконных приложений.
- •Первое оконное приложение
- •Элементы управления
- •Событийно-управляемая модель выполнения оконного приложения
- •Принцип распределения ответственности
- •Элемент управления Timer
- •Динамическое управление обработчиками
- •Вопрос 1: Перед тем как оператор
- •Вопрос 2: Можно ли связать с событием несколько обработчиков и что при этом происходит?
- •Вопрос 3: Можно ли выполнить обратную операцию – исключить обработчик из списка?
- •Элемент управления ListBox
- •Параметры событий. Каскад событий
- •Использование визуального дизайнера
- •Редактирование свойств элементов управления
- •Анализ сгенерированного исходного кода
- •Сохранение результатов
- •Управление объектами файловой системы
- •Информация о логических дисках (класс DriveInfo)
- •Работа с каталогами (папками)
- •Работа с файлами
- •Стандартные диалоговые окна
- •Сериализация
- •Объектные графы
- •Формат сериализации
- •Реконструкция объектов
- •Использование SoapFormatter и XmlSerializer
- •Сохранение коллекций объектов
- •Архитектура программных систем
- •Собственные производные классы элементов управления
- •Другие элементы управления
- •Класс Control
- •Использование возможностей класса Control
- •Ответ на события MouseMove
- •Регистрация щелчков кнопок мыши
- •Ответ на события клавиатуры
- •Функциональные возможности класса Form
- •Цикл существования типа Form
- •Form (Форма)
Анализ сгенерированного исходного кода
Исходный код получившегося на данный момент приложения распределен между тремя файлами Program.cs, Form1.cs и Form1.Designer.cs.
Файл Program.cs - его содержимое совсем небольшое и напоминает код, написанный в «пустом» оконном приложении. Главное в нем – уже знакомый оператор:
Application.Run(new Form1());
Важное отличие – при вызове метода Run используется не стандартный класс Form, а класс Form1. Это производный от Form класс, уже сгенерированный визуальным дизайнером в файлах Form1.cs и Form1.Designer.cs. Эти файлы содержат две «половинки» класса Form1. Такое разделение осуществляется с использованием ключевого слова partial в заголовках класса в обоих файлах:
Файл Form1.cs
public partial class Form1 : Form
. . .
Файл Form1.Designer.cs
partial class Form1
. . .
Главный вопрос – зачем нужно такое разделение. Это удобно в случае активного использования визуального дизайнера. Файл Form1.cs используется программистом для самостоятельного изменения класса. Содержимое файла Form1.Designer.cs автоматически заполняется кодом, сгенерированным визуальным дизайнером.
В текущем состоянии файл Form1.cs очень короткий:
using System;
//другие необходимые директивы using
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
}
Таким образом, в классе Form1 сейчас имеется конструктор, вызывающий метод InitializeComponent. Этот метод содержится в файле Form1.Designer.cs.
Файл Form1.Designer.cs уже сейчас довольно громоздкий. Поэтому при его рассмотрении опустим необязательные подробности. Сначала найдите в этом файле описания переменных класса – они находятся в конце класса Form1:
private System.Windows.Forms.Button button1;
private System.Windows.Forms.Label label1;
private System.Windows.Forms.TextBox textBox1;
Узнаете!? Эти три переменные button1, label1 и textBox1 сгенерированы в ответ на перетаскивание соответствующих элементов из Toolbox на форму.
Кроме того, в классе Form1 определен закрытый метод InitializeComponent:
В начале этого метода для переменных button1, label1 и textBox1 создаются соответствующие объекты:
this.button1 = new System.Windows.Forms.Button();
this.label1 = new System.Windows.Forms.Label();
this.textBox1 = new System.Windows.Forms.TextBox();
Далее для каждого элемента управления происходит установка его свойств. Например, для кнопки button1 это выглядит так:
this.button1.Location = new System.Drawing.Point(92, 52);
this.button1.Name = "button1";
this.button1.Size = new System.Drawing.Size(61, 26);
this.button1.TabIndex = 0;
this.button1.Text = "Делай";
this.button1.UseVisualStyleBackColor = true;
Напомним, что события Click кнопки Button1 был предусмотрен обработчик, который «привязан» к событию оператором:
this.button1.Click += new System.EventHandler(this.button1_Click);
Аналогично выглядит настройка элементов label1 и textBox1.
Для того чтобы форма визуально отображала элементы управления, недостаточно того, что эти элементы являются переменными класса формы. Необходимо разместить их в специальной коллекции, доступной через свойство Controls базового класса Form. В сгенерированном коде этим занимаются следующие строки:
this.Controls.Add(this.textBox1);
this.Controls.Add(this.label1);
this.Controls.Add(this.button1);
В следующем листинге рассмотренная структура программного кода представлена схематично.
Файл Program.cs
class Program
{. . .
static void Main()
{ . . .
Application.Run(new Form1());
}
}
Файл Form1.cs
public partial class Form1 : Form
{ public Form1()
{ InitializeComponent(); }
// обработчики событий
private void button1_Click(object sender, EventArgs e)
{ . . .}
. . .
}
Файл Form1.Designer.cs
partial class Form1
{ . . .
#region Windows Form Designer generated code
private void InitializeComponent()
{ //создание объектов-элементов управления
this.button1 = new System.Windows.Forms.Button();
this.label1 = new System.Windows.Forms.Label();
this.textBox1 = new System.Windows.Forms.TextBox();
// button1
this.button1.Location = new System.Drawing.Point(192, 23);
. . .
this.button1.Click += new System.EventHandler(this.button1_Click);
// label1
. . .
// textBox1
. . .
// Form1
. . .
this.Controls.Add(this.textBox1);
this.Controls.Add(this.label1);
this.Controls.Add(this.button1);
}
#endregion
//описание переменных для элементов управления
private System.Windows.Forms.Button button1;
private System.Windows.Forms.Label label1;
private System.Windows.Forms.TextBox textBox1;
}
Далее можно рассмотреть несколько других примеров:
- крестики-нолики.
Дальнейшая логика курса – рассмотрим способы постоянного хранения. Тогда можно будет рассмотреть архитектурные принципы, основанные на разделении на бизнес-логику, визуальный интерфейс и источник данных.
