namespace MyVisualStudioWinApp {
public partial class MainWindow: Form {
public MainWindow() {
InitializeComponent();
}
}
}
Конструктор, заданный формой по умолчанию, вызывает метод InitializeComponent(), определенный в соответствующем файле *.Designer.cs. Этот метод создается в Visual Studio 2005 автоматически, и в нем автоматически отражаются все модификации выполняемые вами в окне проектирования формы.
Для примера перейдите снова на вкладку окна проектирования формы и найдите свойство Text в окне свойств. Укажите для этого свойства новое значение (например, Мое тестовое окно). Теперь откройте файл Form1.Designer.cs и убедитесь в том, что метод InitializeComponent() соответствующим образом изменен.
private void InitializeComponent() {
…
this.Text = "Мое тестовое окно";
}
Кроме поддержки InitializeComponent(), файл *.Designer.cs определяет члены-переменные, представляющие элементы управления, размещенные в окне проектирования формы. Снова для примера перетащите элемент управления Button (Кнопка) в окно проектирования формы. В окне свойств с помощью свойства Name измените имя соответствующей переменной с button1 на btnTestButton.
Замечание. Всегда лучше переименовать размещаемый элемент управления, перед тем как программировать обработку событий. Если этого не сделать, вы получите целый набор обработчиков событий с неинформативными именами наподобие button27_Click, поскольку при создании соответствующего имени по умолчанию к имени элемента просто добавляется суффикс в виде порядкового номера переменной.
Обработка событий в режиме проектирования
Обратите внимание на то, что в окне свойств есть кнопка с изображением молнии. Вы, конечно, можете вручную создать программный код, обеспечивающий обработку событий уровня формы, (как это было сделано в предыдущих примерах), но эта кнопка позволяет обработать событие для данного элемента управления "визуально". Из раскрывающегося списка (вверху окна свойств) выберите элемент управления, который должен взаимoдeйствoвaть с формой, найдите событие, которое вы хотите обработать, и напечатайте имя, которое должно использоваться для обработчика события (или выполните двойной щелчок на имени события, чтобы сгенерировать типовое имя в виде ИмяЭлемента_ИмяСобытия).
Если задать обработку события Click для элемента управления Button, в файле Form1.cs появится следующий обработчик событий.
public partial class MainWindow: Form {
public MainWindow {
InitializeComponent();
}
private void btnButtonTest_Click(object sender, EventArgs e) {}
}
Файл Form1.Designer.cs будет содержать необходимую инфраструктуру и описание соответствующего члена-переменной.
partial class MainWindow {
…
private void InitializeComponent() {
…
this.btnButtonTest.Click += new System.EventHandler(this.btnButtonTest_Click);
}
private System.Windows.Forms.Button btnButtonTest;
}
Замечание. Каждый элемент управлении имеет свое событие по умолчанию, которое будет обработано при двойном щелчке на этом элементе управления в окне проектирования формы. Например, событием по умолчанию для формы является Load, так что если выполнить двойной щелчок, поместив указатель мыши на тип Form среда разработки автоматически запишет программный код для обработки именно этого события.
Класс Program
Кроме файлов, связанных с формой, Windows-приложение Visual Studio 2005 определяет еще один класс, представляющий объект приложения (т.е. тип, определяющий метод Main()). Обратите внимание на то, что в следующем методе Main() вызывается Application.EnableVisualStyles(), а также Application.Run().
static class Program {
[STAThread]
static void Main() {
Application.EnableVisualStyles();
Application.Run(new MainWindow());
}
}
Замечание. Атрибут [STAThread] дает среде CLR указание обрабатывать все устаревшие COM-объекты (включая элементы управления ActiveX), используя STA-управление (SingleThreaded Apartment – однопоточное размещение). Если вы имеете опыт использования COM, вы должны знать, что STA-управление используется для того, чтобы доступ к COM-типу выполнялся в синхронном (а значит, безопасном в отношении потоков) режиме.
Необходимые компоновочные блоки
Наконец, если Заглянуть в окно Solution Explorer, вы увидите, что проект Windows Forms автоматически ссылается на целый ряд компоновочных блоков, среди которых будут System.Windows.Forms.dll и System.Drawing.dll.
Напомним, что подробное обсуждение System.Drawing.dll предполагается в следующей главе.
Работа с MenuStrip и ContextMenuStrip
В рамках платформы .NET 2.0 рекомендуемым элементом управления для создания системы меню является MenuStrip. Этот элемент управления позволяет создавать как "обычные" пункты меню, такие как Файл→Выход, так и пункты меню, представляющие собой любые подходящие элементы управления. Вот некоторые общие элементы интерфейса, которые могут содержаться в MenuStrip.
• ToolStripMenuItem – традиционный пункт меню.
• ToolStripComboBox – встроенный элемент ComboBox (комбинированное окно).
• ToolStripSeparator – простая линия, разделяющая содержимое.
• ToolStripTextBox – встроенный элемент TextBox (текстовое окно).
С точки зрения программиста, элемент управления MenuStrip содержит строго типизированную коллекцию ToolStripItemCollection. Подобно другим типам коллекции, этот объект поддерживает методы Add(), AddRange(), Remove() и свойство Count. Эта коллекция обычно заполняется не напрямую, а с помощью различных инструментов режима проектирования, но если требуется, то есть возможность обработать ее и вручную.
Чтобы привести пример использования элемента управления MenuStrip, создайте новое приложение Windows Forms с именем MenuStripApp. Поместите элемент управления MenuStrip в форму в окне проектирования, присвоив ему имя mainMenuStrip. В результате в файл *.Designer.cs добавится новая переменная.
private System.Windows.Forms.MenuStrip mainMenuStrip;
Элемент управления MenuStrip имеет очень широкие возможности настройки в режиме проектирования в Visual Studio 2005. Например, вверху у этого элемента управления есть маленькая пиктограмма стрелки, в результате выбора которой появляется контекстно-зависимый "встроенный" редактор содержимого, как показано на рис. 19.11.
Рис. 19.11. "Встроенный" редактор MenuStrip
Такие контекстно-зависимые редакторы cодержимого поддерживаются многими элементами управления Windows Forms. Что же касается MenuStrip, то соответствующий редактор позволяет быстро сделать следующее.
• Вставить "стандартную" систему меню (File, Save, Tools, Help и т.д.), используя ссылку Insert Standard Items (Вставить стандартные элементы).
• Изменить стыковочное поведение MenuStrip.
• Отредактировать любой элемент MenuStrip (это просто "быстрая альтернатива" в отношении возможности выбора соответствующего конкретного элемента в окне свойств).
В этом примере мы проигнорируем возможности "встроенного" редактора, сосредоточившись на создании системы меню "вручную". Сначала в режиме проектирования выберите элемент управления MenuStrip и определите стандартное меню Файл→Выход, впечатав соответствующие имена в поле с подсказкой Type Here (Печатать здесь), рис. 19.12.
Рис. 19.12. Создание системы меню
Замечание. Вы, наверное, знаете, что символ амперсанда (&), размещенный перед буквой в строке элемента меню, задает комбинацию клавиш для быстрого вызова данного элемента. В этом примере указано &Файл→В&ыход, поэтому пользователь может активизировать меню Выход, нажав сначала ‹Alt+ф›, а затем ‹ы›.
Каждый элемент меню, введенный вами в режиме проектирования, представляется типом класса ToolStripMenuItem. Открыв свой файл *.Designer.cs, вы увидите там новые переменные для каждого из введенных элементов.
partial class MainWindow {
private System.Windows.Forms.MenuStrip mainMenuStrip;
private System.Windows.Forms.ToolStripMenuItem fileToolStripMenuItem;
private System.Windows.Forms.ToolStripMenuItem exitToolStripMenuItem;
}
При использовании редактора меню метод InitializeComponent() соответственно обновляется. Для MenuStrip во внутреннюю коллекцию ToolStripItemCollection добавляется элемент, соответствующий новому пункту меню высшего уровня (fileToolStripMenuItem). Точно так же обновляется переменная fileToolStripMenuItem, для которой в ее коллекцию ToolStripItemCollection вставляется переменная exitToolStripMenuItem с помощью свойства DropDownItems.
private void InitializeComponent() {
…
//
// menuStrip1
//
this.menuStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { this.fileToolStripMenuItem });
…
//
// fileToolStripMenuItem
//
this.fileToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { this.exitToolStripMenuItem });