Файл: 1_C#_Введение_в_программирование_Уч_пособ_(Марченко-2005).pdf
ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 11.12.2025
Просмотров: 1393
Скачиваний: 3
Форма
Класс Form
Форма является представлением окна, которое появляется в Windows приложении. Это класс, который можно использовать как основу для создания различных вариантов окошек: стандартных, инструментальных, всплывающих, borderless,
диалоговых, and floating windows.
Создаётся “окно”, а класс называется формой – поскольку в окошке можно разместить элементы управления, обеспечивающие интерактивное взаимодействие приложения и пользователя (заполните форму, please).
Известна особая категория форм – формы (MDI) – формы с многодокументным интерфейсом (the multiple document interface).
Эти формы могут содержать другие формы, которые в этом случае называются MDI child forms. MDI форма создаётся после установки в true свойства
IsMdiContainer.
Форма это класс, включающий свойства, методы и события.
Используя доступные в классе Формы свойства, можно определять внешний вид, размер, цвет, и особенности управления создаваемого окна или диалога.
Свойство Text позволяет специфицировать надпись of the window in the title bar.
Свойства Size и DesktopLocation позволяют определять размеры и положение окна в момент его появления на экране монитора.
Свойство ForeColor позволяет изменить предопределённый foreground color всех элементов управления, placed on the form.
Свойства FormBorderStyle, MinimizeBox, and MaximizeBox позволяют to control whether the form can be minimized, maximized, or resized во время выполнения приложения.
Методы класса обеспечивают управление формой.
Например, метод ShowDialog обеспечивает представление формы как модального dialog box.
Метод Show показывает форму как немодальный dialog box.
Метод SetDesktopLocation используется для позиционирования формы на поверхности desktop.
Форма предназначена для реализации интерфейса пользователя приложения. Содержит большой набор свойств, методов, событий для реализации различных вариантов пользовательского интерфейса. Является окном и наследует классу
Control.
Это означает, что объект-представитель класса Form поддерживает механизмы управления, реализованные на основе обмена сообщениями Windows.
Структура сообщений и стандартные механизмы управления здесь не рассматриваются. Достаточно знать, что класс формы содержит объявление множества событий, для которых на основе стандартного интерфейса (сигнатуры) могут быть реализованы и легко подключены функции обработки событий.
Форма может использоваться как the starting class в приложении. При этом класс формы должен содержать точку входа – статический метод Main. В теле этого метода обычно размещается код, обеспечивающий создание и формирование внешнего вида формы.
Обычно заготовка формы “пишется” мастером. Пример кода простой заготовки окна прилагается. Форма настолько, что после некоторой медитации может быть воспроизведена вручную.
using System;
using System.Drawing; using System.Collections;
using System.ComponentModel; using System.Windows.Forms; using System.Data;
namespace FormByWizard
{
///<summary>
///Summary description for Form1.
///</summary>
175
public class Form1 : System.Windows.Forms.Form
{
///<summary>
///Required designer variable.
///</summary>
private System.ComponentModel.Container components = null;
public Form1()
{
//
//Required for Windows Form Designer support
InitializeComponent();
//TODO: Add any constructor code after InitializeComponent call
}
///<summary>
///Clean up any resources being used.
///</summary>
protected override void Dispose( bool disposing )
{
if( disposing )
{
if (components != null)
{
components.Dispose();
}
}
base.Dispose( disposing );
}
#region Windows Form Designer generated code
///<summary>
///Required method for Designer support - do not modify
///the contents of this method with the code editor.
///</summary>
private void InitializeComponent()
{
this.components = new System.ComponentModel.Container(); this.Size = new System.Drawing.Size(300,300);
this.Text = “Form1”;
}
#endregion
///<summary>
///The main entry Point for the application.
///</summary>
[STAThread] static void Main()
{
Application.Run(new Form1());
}
}
}
Главная проблема – метод InitializeComponent(). Это зона ответственности мастера приложений и не рекомендуется в этом методе делать что-либо самостоятельно. Во избежание потери всего того, что там может быть построено, поскольку мастер приложения может изменить содержимое тела метода в соответствии с изменениями внешнего вида приложения.
В этом классе куча всяких методов. Интересно посмотреть на внушительный список обработчиков событий.
Важна строчка в теле функции Main
Application.Run(new Form1());
176
Впринципе эта строчка и отвечает за создание, “запуск” в потоке приложения
ивозможное появление на экране дисплея формы.
Форма: управление и события жизненного цикла
Управление жизненным циклом и отображением форм осуществляется следующими методами:
Form.Show(),
Form.ShowDialog(),
Form.Activate(),
Form.Hide(),
Form.Close().
Имеет смысл рассмотреть события, связанные с созданием, функционированием и уничтожением формы. К их числу относятся:
Load. Генерируется ОДИН РАЗ, непосредственно после первого вызова метода Form.Show() или Form.ShowDialog(). Это событие можно использовать для первоначальной инициализации переменных и для подготовки формы к работе. Сколько в приложении форм, столько раз будет генерироваться это событие. Назначение максимальных и минимальных размеров формы – для этого более подходящего места, нежели обработчик события OnLoad не найти!
Activated. Многократно генерируется в течение жизни формы. Когда Windows активизирует форму. Связано с получением и потерей фокуса. Все необходимые мероприятия выполняются здесь. Методы Form.Show(), Form.ShowDialog(), Form.Activate() (передача фокуса, реализованная программно!) способствуют этому. Передача фокуса элементу управления (кнопка – это тоже окно) сопровождается автоматическим изменением цвета элемента управления.
VisibleChanged. Генерируется всякий раз при изменении свойства Visible формы. Когда она становится видимой или невидимой. Событию способствуют методы
Form.Show(), Form.ShowDialog(), Form.Hide(), Form.Close().
Deactivated. Возникает при потере фокуса формой в результате взаимодействия с пользовательским интерфейсом либо в результате вызова методов Form.Hide() или Form.Cloze() – но только для активной формы. Если закрывать неактивную форму, событие не произойдёт! Сказано, что Activated и Deactivated возбуждаются только при перемещении фокуса в пределах приложения. При переключении с одного приложения на другое эти события не генерируются.
Closing. Непосредственно перед закрытием формы. В этот момент процесс закрытия формы может быть приостановлен и вообще отменён, чему способствует размещаемый в теле обработчика события следующий программный код: e.Cancel = true; // e - событие типа CancelEventArgs.
Closed. Уже после закрытия формы. Назад пути нет. В обработчике этого события размещается любой код для “очистки” после закрытия формы.
Форма: контейнер как элемент управления
Container controls – место для группировки элементов пользовательского интерфейса. И это не простая группировка! Контейнер может управлять доступом к размещаемым не его поверхности элементам управления. Это обеспечивается за счёт свойства Enable, которое будучи установленным в false, закрывает доступ к размещаемым в контейнере компонентам. “Поверхность” контейнера у некоторых его разновидностей не ограничивается непосредственно видимой областью. Могут быть полосы прокрутки.
Каждый контейнер поддерживает набор элементов, который состоит из всех вложенных в него элементов управления. У контейнера имеются свойства Count, которое возвращает количество элементов управления, свойство [ИНДЕКСАТОР],
методы Add и Remove.
Кчислу контейнеров относятся:
Form… Без комментариев!
Panel. Элемент управления, содержащий другие элеменгты управления. You can use a Panel to для группировки множества элементов управления, как например,
группа of RadioButton controls. The Panel control is displayed по умолчанию БЕЗ всяческих рамок. Нет у ПАНЕЛИ и заголовка. Рамки можно заказать. You can
177
provide a standard or three-dimensional border using the BorderStyle property to distinguish the area of the panel from other areas on the form. Panel является производным классом от the ScrollableControl class, а это значит, что можно заказать и полосы прокрутки, путём изменения значения соответствующего свойства. И всё, что располагается на панели за пределами видимости, при условии установки свойства AutoScroll в true, any controls located within the Panel (but outside of its visible region), can be scrolled to with the scroll bars provided.
GroupBox. Предполагается для размещения радиокнопок и прочих переключателей. Рисует рамочку вокруг элементов управления, которые группируются по какомулибо признаку. В отличие от панели имеет заголовок, который, впрочем, можно не использовать. Не имеет полос прокрутки.
TabControl. Содержит tab pages, которые представлены TabPage объектами, которые могут добавляться через свойство Controls. Каждая TabPage-страница подобна листку записной книжки: страница с закладкой. И в зависимости от того, подцеплены ли tab pages к объекту-представителю класса TabControl, будут генерироваться следующие события: Control.Click, Control.DoubleClick, Control.MouseDown, Control.MouseUp, Control.MouseHover, Control.MouseEnter, Control.MouseLeave and Control.MouseMove. If there is at least one TabPage in the collection, and the user interacts with the tab control’s header (where the TabPage names appear), the TabControl raises the appropriate event. However, if the user interaction is within the ClientRectangle of the tab page, the TabPage raises the appropriate event. От взаимодействия со страницей генерируются одни события, от взаимодействия с корешком – другие.
Разница между элементами управления и компонентами.
Элемент управления имеет видимое представление и непосредственно используется в процессе управления формой. Компоненты (таймер, провайдеры дополнительных свойств) видимого представления не имеют. И поэтому в управлении формой участвуют опосредованно.
Свойства элементов управления. Anchor и Dock
Средства, которые обеспечивают стыковку и фиксацию элементов управления в условиях изменяемых размеров контейнера.
Anchor позволяет автоматически выдерживать постоянное расстояние между границами элемента управления, для которого оно определено, и границами контейнера. И это обеспечивается за счёт автоматического изменения размеров “зацепленного” элемента управления вслед за изменениями размеров контейнера. Таким образом обеспечивается реакция элемента управления на изменения контейнера.
Dock – стыковка. Прикрепление элемента управления к границе контейнера. Dock – свойство элемента управления, а не контейнера. Центральный прямоугольник приводит к тому, что элемент управления заполнит всю поверхность контейнера.
Extender providers. Провайдеры дополнительных свойств
An extender provider - компонент, который предоставляет свойства другим компонентам. Это делается с целью расширения множества свойств (элементов управления).
ToolTipProvider,
HelpProvider,
ErrorProvider.
Например, когда a ToolTip Component (Windows Forms) компонент добавляется к форме, все остальные компоненты, размещённые на этой форме, получают новое свойство, которое даже можно просматривать и устанавливать (редактировать) в окне Properties непосредственно в процессе разработки формы. И это новое свойство, называемое ToolTip, вызывается для каждого элемента управления данной формы.
Не надо обольщаться. Множество свойств элементов управления не изменилось. Дополнительное свойство предоставляется ВСЕМ элементам отдельным компонентом.
178
На этапе разработки, это свойство появляется в Properties window for the component that is being modified.
Однако при выполнении (at run time), это свойство не может быть доступно (accessed) непосредственно через данный конкретный элемент управления.
В следующем примере кода форма была построена с кнопочкой, которая была названа MyButton и элементол управления ToolTip, названным MyToolTip, which provides a ToolTip property.
//И вот так просто и наивно значение свойства кнопочки не получить,
//поскольку это свойство не родное!
//This is an example of code that is NOT CORRECT!
string myString;
myString = MyButton.ToolTip;
Подобное обращение пиведёт к ошибке ещё на стадии компиляции. А вот как надо обращаться к этому самому дополнительному свойству, установленному для кнопочки (просто форменное надувательство):
string myString;
myString = MyToolTip.GetToolTip(MyButton);
Провайдеры дополнительных свойств являются классами, а это означает, что у них имеются собственные свойства и методы.
Пример…
using System;
using System.Drawing; using System.Collections;
using System.ComponentModel; using System.Windows.Forms;
namespace Rolls01
{
///<summary>
///Summary description for numPointsForm.
///</summary>
public class numPointsForm : System.Windows.Forms.Form
{
Form1 f1; int nPoints;
private System.Windows.Forms.TextBox numBox; private System.Windows.Forms.Button button1; private System.ComponentModel.IContainer components;
private System.Windows.Forms.ToolTip toolTip;
// Ссылка на объект-представитель класса ErrorProvider private System.Windows.Forms.ErrorProvider errorProvider;
private string[] errMess;
public numPointsForm(Form1 f1Key)
{
f1 = f1Key; InitializeComponent(); errMess = new string[] {
"Больше двух тараканов!", "Целое и больше двух!"
};
}
///<summary>
///Clean up any resources being used.
///</summary>
protected override void Dispose( bool disposing )
{
if( disposing )
{
if(components != null)
179
{
components.Dispose();
}
}
base.Dispose( disposing );
}
#region Windows Form Designer generated code
///<summary>
///Required method for Designer support - do not modify
///the contents of this method with the code editor.
///</summary>
private void InitializeComponent()
{
this.components = new System.ComponentModel.Container(); this.numBox = new System.Windows.Forms.TextBox(); this.button1 = new System.Windows.Forms.Button();
this.toolTip = new System.Windows.Forms.ToolTip(this.components); this.SuspendLayout();
//
//numBox
this.numBox.Location = new System.Drawing.Point(8, 11); this.numBox.Name = "numBox";
this.numBox.Size = new System.Drawing.Size(184, 20); this.numBox.TabIndex = 0;
this.numBox.Text = ""; this.numBox.Validating +=
new System.ComponentModel.CancelEventHandler(this.numBox_Validating);
//button1
//
this.button1.Location = new System.Drawing.Point(208, 8); this.button1.Name = "button1";
this.button1.TabIndex = 1; this.button1.Text = "OK";
this.button1.Click += new System.EventHandler(this.button1_Click);
//
// numPointsForm
//
this.AutoScaleBaseSize = new System.Drawing.Size(5, 13); this.ClientSize = new System.Drawing.Size(288, 45); this.Controls.Add(this.button1); this.Controls.Add(this.numBox);
this.MaximizeBox = false; this.MinimizeBox = false; this.Name = "numPointsForm"; this.Text = "numPointsForm";
this.Load += new System.EventHandler(this.numPointsForm_Load); this.ResumeLayout(false);
}
#endregion
private void numBox_Validating
(object sender, System.ComponentModel.CancelEventArgs e)
{
int x; try
{
x = int.Parse(numBox.Text); if (x <= 1)
{
numBox.Text = nPoints.ToString(); e.Cancel = true;
errorProvider.SetError(numBox, this.errMess[0]);
}
else
{
nPoints = x;
}
}
180