Мы уже знаем, что "жизнь" формы начинается тогда, когда вызывается конструктор типа, перед его передачей методу Application.Run(). В дальнейшем "оконные типы" поддерживают множество событий, происходящих в различные моменты цикла существования таких типов.
После размещения соответствующего объекта в управляемой динамической памяти среда разработки приложений генерирует событие Load. В обработчике событий Load можно настроить вид и поведение формы, подготовить содержащиеся в форме дочерние элементы управления (окна списков, деревья просмотра и т.д.), организовать доступ к ресурсам, необходимым для работы формы (установить связь с базами данных, создать агенты для удаленных объектов и т.д.).
Следующим событием, генерируемым после события Load, является событие Activated. Это событие генерируется тогда, когда форма получает фокус ввода, как активное окно на рабочем столе. Логическим "антиподом" события Activated является (конечно же) событие Deactivate, которое генерируется тогда, когда форма утрачивает фокус ввода, становясь неактивным окном. Легко догадаться, что события Activated и Deactivate в цикле существования формы могут генерироваться множество раз, поскольку пользователь может переходить от одного активного приложения к другому.
Когда пользователь решает закрыть соответствующую форму, по очереди генерируются еще два события: Closing и Closed. Событие Closing генерируется первым и дает возможность предложить конечному пользователю многими нелюбимое (но полезное) сообщение "Вы уверены, что хотите закрыть это приложение?". Этот шаг с требованием подтвердить выход полезен тем, что пользователю получает возможность сохранить данные соответствующего приложения перед завершением работы программы.
Событие Closing работает в паре с делегатом CancelEventHandler, определенным в пространстве имен System.ComponentModel. Если установить для свойства CancelEventArgs.Cancel значение true (истина), форме будет дано указание возвратиться к нормальной работе, и форма уничтожена не будет. Если установить для CancelEventArgs.Cancel значение false (ложь), будет сгенерировано событие Closed, и приложение Windows Forms будет завершено (домен приложения будет выгружен и соответствующий процесс прекращен).
Чтобы закрепить в памяти последовательность событий, происходящих в рамках цикла существования формы, рассмотрим новый файл MainWindow.cs, в котором события Load, Activated, Deactivate, Closing и Closed обрабатываются в конструкторе класса так, как показано ниже (не забудьте добавить в программу директиву using для пространства имен System.ComponentModel, чтобы получить доступ к определению CancelEventArgs).
public MainForm()
{ // Обработка различных событий цикла существования формы.
Closing += new CancelEventHandler(MainForm_Closing);
Load += new EventHandler(MainForm_Load);
Closed += new EventHandler(MainForm_Closed);
Activated += new EventHandler(MainForm_Activated);
Deactivate += new EventHandler(MainForm_Deactivate);
}
В обработчиках событий Load, Closed, Activated и Deactivate в строковую переменную lifeTimelnfo добавляется имя перехваченного события. Обработчик события Closed отображает значение этой строки в окне сообщения.
private void MainForm_Load(object sender, System.EventArgs e)
{ lifeTimelnfo += "Событие LoadW; }
private void MainForm_Activated(object sender, System.EventArgs e)
{ lifeTimelnfo += "Событие Activate\n"; }
private void MainForm_Deactivate(object sender, System.EventArgs e)
{ lifeTimelnfo += "Событие Deactivated"; }
private void MainForm_Closed(object sender, System.EventArgs e)
{ lifeTimelnfo += "Событие ClosedW; MessageBox.Show(lifeTimelnfo); }
В обработчике события Closing задается вопрос о том, действительно ли пользователь желает завершить работу приложения. При этом используется поступающий на вход объект CancelEventArgs.
private void MainForm_Closing(object sender, CancelEventArgs e)
{ DialogResult dr =
MessageBox.Show("Вы ДЕЙСТВИТЕЛЬНО хотите закрыть приложение?",
"Событие Closing!", MessageBoxButtons.YesNo);
if (dr == DialogResult.No) e.Cancel = true;
else e.Cancel = false;
}
Обратите внимание на то, что метод MessageBox.Show() возвращает тип DialogResult, значение которого идентифицирует кнопку (Да, Нет), нажатую в форме конечным пользователем. Запустите приложение на выполнение и несколько раз поочередно предоставьте форме фокус ввода и уберите ее из фокуса ввода (чтобы сгенерировать события Activated и Deactivate). После прекращения работы вы увидите блок сообщений, аналогичный показанному на рис. 19.5.
Рис. 19.5. "Биография" типа, производного от Form
Большинство наиболее интересных возможностей типа Form связано с созданием и настройкой систем меню, панелей инструментов и строк состояния. Необходимый для этого программный код не слишком сложен, но Visual Studio 2005 предлагает целый набор графических инструментов проектирования, которые позаботятся о создании значительной части такого программного кода за вас. Поэтому давайте на время скажем "до свидания" компилятору командной строки и займемся созданием приложений Windows Forms с помощью Visual Studio 2005.
Списки
Переключатели
Меню
Timer
Form (Форма)
Свойства формы (объекта класса Form)
Свойство
| Описание
|
Name
| Имя формы
|
Text
| Текст заголовка
|
Location
| Положение компонента на поверхности формы
|
Size.Width
| Ширина формы (рабочая область вместе с правой и левой границей)
|
Size.Height
| Высота формы (рабочая область вместе с верхней, нижней границей и заголовком)
|
StartPosition
| Положение формы в момент первого появления на экране (после запуска программы). Форма может находиться в центре экрана (CenterScreen), в центре родительской формы (CenterParent). Положение формы может также определяться значением свойства Location. В последнем случае свойство StartPosition должно иметь значение Manual
|
Location.X
| Расстояние от верхней границы формы до верхней границы экрана (или родительской формы)
|
Location.Y
| Расстояние от левой границы формы до левой границы экрана (или родительской формы)
|
FormBorderStyle
| Вид границы формы. Граница может быть масштабируемой (Sizable), тонкой не масштабируемой (FixedSingle), отсутствовать (None). При отсутствии границы (None) окно отображается без заголовка, вследствие чего изменить размер и положение такого окна не удастся
|
ControlBox
| Если значение равно False, системное меню программы (контекстное меню, отображаемое при правом щелчке мыши на заголовке окна программы или на панели задач), а также кнопки управления окном не отображаются (команды Свернуть, Развернуть, Закрыть в заголовке окна программы)
|
MaximizeBox
| Признак доступности кнопки Развернуть
|
MinimizeBox
| Признак доступности кнопки Свернуть
|
Icon
| Значок в заголовке окна
|
Font
|
|
Opacity
| Степень прозрачности формы. Форма может быть абсолютно непрозрачной (100%) или абсолютно прозрачной (0 %). Если значение находится в диапазоне 0—100%, то сквозь форму будет видна поверхность, на которой она находится
|
Базовые компоненты (элементы управления)
Button
Компонент Button представляет собой командную кнопку. Свойства компонента приведены в табл. 2.2.
Таблица. 2.2. Свойства компонента Button
Свойство
| Описание
|
Text
| Текст (надпись) на кнопке
|
TextAlign
| Положение текста (надписи) на кнопке. Надпись может располагаться в центре (MiddleCenter), быть прижата к левой (MiddleLeft) или правой (MiddleRight) границе Можно задать и другие способы размещения надписи (TopLeft, TopCenter, TopRight, BottomLeft, BottomCenter. BottomRight)
|
FlatStyle
| Кнопка может быть стандартной (Standard), плоской (Flat) или "всплывающей" (Popup)
|
Location
| Положение кнопки на поверхности формы. Уточняющее свойство X определяет расстояние от левой границы кнопки до левой границы формы, уточняющее свойство Y - от верхней границы кнопки до верхней границы клиентской области формы (нижней границы заголовка)
|
Size
| Размер кнопки
|
Font
| Шрифт, используемый для отображения текста на кнопке
|
ForeColor
| Цвет текста, отображаемого на кнопке
|
Enabled
| Признак доступности кнопки. Кнопка доступна, если значение свойства равно True, и недоступна (например, событие Click в результате щелчка на кнопке не возникает), если значение свойства равно False
|
Visible
| Позволяет скрыть кнопку (False) или сделать ее видимой (True)
|
Image
| Картинка на поверхности формы. Рекомендуется использовать gif-файл, в котором определен прозрачный, цвет
|
ImageAlign
| Положение картинки на кнопке. Картинка может располагатъся в центе (MiddleCenter), быть прижата к левой (MiddleLeft) или правой (MiddleRight) границе. Можно задать и другие способы размещения картинки на кнопке (TopLeft, TopCenter, TopRight, BottomLeft, BottomCenter, BottomRight)
|
ImageList
| Набор изображений, из которых может быть выбрано то, которое будет отображаться на поверхности кнопки. Представляет собой объект типа ImageList. Чтобы задать значение свойства, в форму приложения нужно добавить компонент ImageList
|
ImageIndex
| Номер (индекс) изображения из набора ImageList, которое отображается на кнопке
|
ToolTip
| Подсказка, появляющаяся рядом с указателем мыши при позиционировании его на кнопке. Чтобы свойство было доступно, в форму приложения надо добавить компонент ToolTip
|
ComboBox
Компонент ComboBox представляет собой комбинацию поля редактирования и списка, что дает возможность ввести данные путем набора на клавиатуре или выбором из списка. Свойства компонента приведены в табл. 2.3.
Таблица 2.3. Свойства компонента CamboBox
Свойство
| Описание
|
DropDownStуle
| Вид компонента: DropDown - поле ввода и раскрывающийся список; Simple - поле ввода со списком; DropDownList - раскрывающийся список
|
Text
| Текст, находящийся в поле ввода/редактирования (для компонентов типа DropDown и Simple)
|
Items
| Элементы списка - коллекция строк
|
Items.Count
| Количество элементов списка
|
SelectedIndex
| Номер элемента, выбранного в списке. Если ни один из элементов списка не выбран, то значение свойства равно -1
|
Sorted
| Признак необходимости автоматической сортировки (True) списка после добавления очередного элемента
|
MaxDropDownItems
| Количество отображаемых элементов в раскрытом списке. Если количество элементов списка больше чем MaxDropDownItems, то появляется вертикальная полоса прокрутки
|
Location
| Положение компонента на поверхности формы
|
Size
| Размер компонента без (для компонентов типа DropDown и DropDownList) или с учетом (для компонента типа Simple) размера области списка или области ввода
|
DropDownWidth
| Ширина области списка
|
Font
| Шрифт, используемый для отображения содержимого поля редактирования и элементов списка
|
ContextMenu
Компонент ContextMenu представляет собой контекстное меню — список команд, который отображается в результате щелчка правой кнопкой мыши. Элементы контекстного меню - объекты MenuItem. Свойства объекта MenuItem приведены в табл. 2.4.
Таблица 2.4. Свойства объекта Menuitem
Свойство
| Описание
|
Text
| Текст команды контекстного меню
|
Enabled
| Признак доступности команды. Если значение свойства равно False, то команда недоступна (в результате щелчка на команде событие Click не происходит, название элемента меню отображается инверсным цветом по отношению к доступному пункту меню)
|
Checked
| Признак того, что элемент меню выбран. Если значение свойства равно True, то элемент помечается галочкой или (если значение свойства RadioCheck равно True) точкой. Свойство Checked обычно используется для тех элементов меню, которые применяются для отображения параметров
|
RadioCheck
| Признак того, что для индикации состояния свойства Checked используется точка (True), а не галочка (False)
|
CheckBox
Компонент CheckBox представляет переключатель, который может находиться в одном из двух состояний: выбранном или невыбранном. Часто вместо «выбранный» говорят «установленный», вместо «невыбранный» - «сброшенный» или «выключенный». Рядом с переключателем обычно находится поясняющий текст. Свойства компонента CheckBox приведены в табл. 2.5.
Таблица 2.5. Свойства компонента CheckBox
Свойство
| Описание
|
Text
| Текст, который находится справа от кнопки
|
Checked
| Состояние, внешний вид переключателя. Если переключатель выбран, то значение свойства равно True. Если переключатель сброшен, то значение свойства равно False
|
TextAllign
| Положение текста в попе отображения текста. Текст может располагаться в центре поля (MiddleCenter), быть прижат к левой (MiddleLeft) или правой (MiddleRight) границе. Можно задать и другие способы размещения текста надписи (TopLeft, TopCenter,
|
CheckAllign
| Положение кнопки в поле компонента. Кнопка может быть прижата к левой верхней границе (TopLeft), прижата к левой границе и находиться на равном расстоянии от верхней и нижней границ поля компонента (MiddleLeft). Есть и другие варианты размещения кнопки в поле компонента
|
Enabled
| Свойство позволяет сделать переключатель недоступным (False)
|
Visible
| Свойство позволяет скрыть (False) переключатель
|
AutoCheck
| Свойство определяет, должно ли автоматически изменяться состояние переключателя в результате щелчка на его изображении. По умолчанию значение равно True
|
FlatStyle
| Стиль (вид) переключателя. Переключатель может быть обычным (Standard), плоским (Flat) или "всплывающим" (Popup). Стиль определяет поведение переключателя при позиционировании указателя мыши на его изображении
|
Appearance
| Определяет вид переключателя. Переключатель может выглядеть обычным образом (Normal) или как кнопка (Button)
|
Image
| Картинка, которая отображается в поле компонента
|
ImageAlign
| Положение картинки в поле компонента. Картинка может располагаться в центре (MiddleCenter), быть прижата к левой (MiddleLeft) или правой (MiddleRight) границе. Можно задать и другие способы размещения картинки на кнопке (TopLeft, TopCenter, TopPight, BottoinLeft, BottomCenter, BottomRight)
|
ImageList
| Набор картинок, используемых для обозначения различных состояний кнопки. Представляет собой объект типа ImageList. Чтобы задать значение свойства, в форму приложения следует добавить компонент ImageList
|
ImageIndex
| Номер (индекс) картинки из набора ImageList, которая отображается в поле компонента
|
CheckedListBox
Компонент CheckedListBox представляет собой список, перед каждым элементом которого находится переключатель CheckBox. Свойства компонента CheckedListBox приведены в табл. 2.6.
Таблица 2.6. Свойства компонента CheckedListBox
Свойство
| Описание
|
Items
| Элементы списка - коллекция строк
|
Items.Count
| Количество элементов списка
|
Sorted
| Признак необходимости автоматической сортировки (True) списка после добавления очередного элемента
|
CheckOnClick
| Способ пометки элемента списка. Если значение свойства равно False, то первый щелчок выделяет элемент списка (строку), а второй устанавливает в выбранное состояние переключатель. Если значение свойства равно True, то щелчок на элементе списка выделяет элемент и устанавливает во включенное состояние переключатель
|
CheckedItems
| Свойство CheckedItems представляет собой коллекцию, элементы которой содержат выбранные элементы списка
|
CheckedItems.Count
| Количество выбранных элементов списка, переключатели которых установлены в выбранное состояние
|
CheckedIndices
| Свойство Checkedlndices представляет собой коллекцию, элементы которой содержат номера выбранных (помеченных) элементов списка
|
MultiColumn
| Признак необходимости отображать список в несколько колонок. Количество отображаемых колонок зависит от количества элементов и размера области отображения списка
|
Location
| Положение компонента на поверхности формы
|
Size
| Размер компонента без (для компонентов типа DropDown и DropDownList) или с учетом (для компонента типа Simple) размера области списка или области ввода
|
Font
| Шрифт, используемый для отображения содержимого поля редактирования и элементов списка
|
GroupBox
Компонент GroupBox представляет собой контейнер для других компонентов. Обычно он используется для объединения в группы компонентов RadioButton по функциональному признаку. Свойства компонента GroupBox приведены в табл. 2.7.
Таблица 2.7. Свойства компонента GroupBox
Text
| Заголовок - текст, поясняющий назначение компонентов, которые находятся в поле компонента GroupBox
|
Enabled
| Позволяет управлять доступом к компонентам, находящимся в поле (на поверхности) компонента GroupBox. Если значение свойства равно False, то все находящиеся в поле GroupBox компоненты недоступны
|
Visible
| Позволяет скрыть (сделать невидимым) компонент GroupBox и все компоненты, которые находится на его поверхности
|
ImageList
Компонент ImageList представляет собой коллекцию изображений и может использоваться другими компонентами (например, Button или TooiBar) как источник иллюстраций. Компонент является невизуальным, т. е. он не отображается в окне программы но время ее работы. Во время создания формы компонент отображается в нижней части окна редактора формы. Свойства компонента ImageList приведены в табл. 2.8.
Таблица 2.8. Свойства компонента ImageList
Свойство
| Описание
|
Images
| Коллекция изображений (объектов Bitmap)
|
ImageSize
| Размер изображений коллекции. Уточняющее свойство Width определяет ширину изображений, Height —высоту
|
TransparentColor
| Прозрачный цвет. Участки изображения, окрашенные этим цветом, не отображаются
|
ColorDepth
| Глубина цвета - количество байтов, используемых для кодирования цвета точки (пиксела)
|
Label
Компонент Label предназначен для отображения текстовой информации. Задать текст, отображаемый в поле компонента, можно как во время разработки формы, так и во время работы программы, присвоив нужное значение свойству Text. Свойства компонента приведены в табл. 2.9.
Таблица 2.9. Свойства компонента Label
Свойство
| Описание
|
Name
| Имя компонента. Используется в программе для доступа к свойствам компонента
|
Text
| Отображаемый текст
|
Location
| Положение компонента на поверхности формы
|
Size
| Размер компонента (поля отображения текста)
|
Font
| Шрифт, используемый для отображения текста
|
ForeColor
| Цвет текста, отображаемого в поле компонента
|
BackColor
| Цвет закраски области вывода текста
|
TextAlign
| Способ выравнивания (расположения) текста в поле компонента. Всего существует девять способов расположения текста. На практике наиболее часто используют выравнивание по левой верхней границе (TopLeft), посередине (TopCentre) и по центру (MiddleCenter)
|
BorderStyle
| Вид рамки (границы) компонента. По умолчанию граница вокруг поля Label отсутствует (значение свойства равно None). Граница компонента может быть обычной (Fixed3D) или тонкой (FixedSinqle)
|
ListBox
Компонент ListBox представляет собой список, в котором можно выбрать нужный элемент. Свойства компонента приведены в табл. 2.10.
Таблица 2.10. Свойства компонент ListBox
Свойство
| Описание
|
Items
| Элементы, списка - коллекция строк
|
Items.Count
| Количество элементов списка
|
SelectedIndex
| Номер элемента, выбранного в списке. Если ни один из элементов списка не выбран, то значение свойства равно-1
|
Sorted
| Признак необходимости автоматической сортировки (True) списка после добавления очередного элемента
|
SelectionMode
| Определяет режим выбора элементов списка: One - только один элемент; MultiSimple— можно выбрать несколько элементов, сделав щелчок на нужных элементах списка; MultiExtended - можно выбрать несколько элементов, сделав щелчок на нужных элементах списка при нажатой клавише <Ctrl>, или выделить диапазон, щелкнув при нажатой клавише <Shift> на первом и последнем элементе диапазона
|
MultiColumn
| Признак необходимости отображать список в несколько колонок Количество отображаемых колонок зависит от количества элементов и размера области отображения списка
|
Location
| Положение компонента на поверхности формы
|
Size
| Размер компонента без (для компонентов типа DropDown и DropDownList) или с учетом (для компонента типа Simple) размера области списка или области ввода
|
Font
| Шрифт, используемый для отображения содержимого поля редактирования и элементов списка
|
MainMenu
Компонент MainMenu представляет собой главное меню программы. Элементы меню - объекты MenuItem. Свойства объекта MenuItem. приведены в табл. 2.11.
Таблица 2.11. Свойства объекта MenuItem
Свойство
| Описание
|
Text
| Название элемента меню
|
Enabled
| Признак доступности элемента меню. Если значение свойства равно False, то элемент меню недоступен (в результате щелчка на элементе меню событие Click не происходит, название элемента меню отображается инверсным цветом по отношению к доступному пункту меню)
|
Checked
| Признак того, что элемент меню выбран. Если значение свойства равно True, то элемент помечается галочкой. Свойство Checked обычно используется для тех элементов меню, которые применяются для отображения параметров
|
Shortcut
| Свойство определяет функциональную клавишу (или комбинацию клавиш), нажатие которой активизирует выполнение команды
|