ООП — Лабораторная работа №2


Чтобы посмотреть этот PDF файл с форматированием и разметкой, скачайте его и откройте на своем компьютере.
Лабораторная работа №
2

С
оздание приложения Windows Form
.

Стандартные элементы
управления и компоненты
.





1.

Цель

изуч
ить

метод
ы

создания приложений с использованием
Windows

Form
.

Также изучить
стандартные компоненты и научиться их
применять

на практике͘


2.

Методические указания

1.

При изучении
языка

программирования

С# будет использоваться интегрированная
среда разработки программного обеспечения
Microsoft Visual Studio Express 2013 для
Windows Desktop͘ Будут использованы основные элементы ͘NET Framework
и связь С# с
элементами платформы ͘NET͘

2.

По окончанию работы сохраните все созданные файлы на своих носителях͘

3.

Защита лабораторной работы производится только при наличии электронного варианта
работающего скрипта͘


3.

Теоретические сведения

Первое, что необходимо
сделать


создать приложение Windows Forms͘ Для примера
создадим пустую форму, и отобразим ее на экране͘


using

System;

using

System.Windows.Forms;

namespace

NotepadForms

{


public

class

MyForm

: System.Windows.Forms.
Form


{


public

MyForm()


{


}


[
STAThread
]


static

void

Main()


{


Application
.Run(
new

MyForm
());


}


}

}


Когда мы скомпилируем и запустим этот пример, то получим маленькую пустую форму без
заголовка͘ Никаких
реальных функций, но это


Windows Forms͘ В приведенном коде
заслуживают внимания две вещи͘ Первая


тот факт, что при создании класса
MyForm

используется наследование͘ Следующая строка объявляет
MyForm

как наследника
System.Windows.Forms.Form:


public class MyForm : System.Windows.Forms.Form


Класс Form


один из главных классов в пространстве имен System͘Windows͘Forms͘

Следующий фрагмент кода стоит рассмотреть более подробно͗


[STAThread]

static void Main()

{

Application.Run(new MyForm());

}


M
ain


точка входа по умолчанию в любое клиентское приложение на C#͘ Как правило, в
более крупных приложениях метод Main() не будет находиться в классе формы, а скорее в
классе, отвечающем за процесс запуска͘ В данном случае вы должны установить имя такого
запускающего класса в диалоговом окне свойств проекта͘ Обратите внимание на атрибут
*STAThread+͘ Он устанавливает модель многопоточности COM в STA (однопоточный
апартамент)͘ Модель многопоточности STA требуется для взаимодействия с COM и
устанавливается по

умолчанию в каждом проекте Windows Forms͘

Метод Application͘Run() отвечает за запуск стандартного цикла сообщений приложения͘
Application͘Run() имеет три перегрузки͘

Первая из них не принимает параметров͖ вторая принимает в качестве параметра объект
Appl
icationContext͘ В нашем примере объект MyForm становится главной формой приложения͘
Это означает, что когда форма закрывается, то приложение завершается͘ Используя класс
ApplicationContext, можно в большей степени контролировать завершение главного цикла
с
ообщений и выход из приложения͘

Класс Applicationсодержит в себе очень полезную функциональность͘ Он предоставляет
группу статических методов и свойств для управления процессом запуска

и останова приложения, а также обеспечивает доступ к сообщениям Window
s,
обрабатываемым приложением͘ В табл͘ 2͘1 перечислены некоторые из этих наиболее
полезных методов и свойств͘

Таблица 2͘1͘ Некоторые полезные методы и свойства класса Application



А теперь как будет выглядеть
это приложение, если его сгенерировать в Visual Studio 2010?
Первое, что следует отметить


будет создано два файла͘ Причина в том, что Visual Studio 2010
использует возможность частичных (partial) классов и выделяет весь код, сгенерированный
визуальным ди
зайнером, в отдельный файл͘ Если используется имя по умолчанию


Form1, то
эти два файла будет называться Form1͘cs и Form1͘Designer͘cs͘ Если только у вас не включена
опция Show All Files (Показать все файлы) в меню Project (Проект), то вы не увидите в
пров
однике Solution Explorer файла Form1͘Designer͘cs͘ Ниже показан код этих двух файлов,
сгенерированных Visual Studio͘

Сначала



Form1.cs:


using

System;

using

System.Collections.Generic;

using

System.ComponentModel;

using

System.Data;

using

System.Drawing;

using

System.Linq;

using

System.Text;

using

System.Threading.Tasks;

using

System.Windows.Forms;


namespace

MyForm

{


public

partial

class

Form1

:
Form


{


public

Form1()


{


InitializeComponent();


}


}

}


Здесь мы видим только операторы using и простой конструктор͘ А

вот

код

Form1.

Designer.cs:


namespace

MyForm

{


partial

class

Form
1


{


///

&#xsumm; ry0;summary


///

Требуется переменная конструктораB


///

&#x/sum;&#xmary;/summary


private

System.ComponentModel.
IContainer

components =
null
;



///

&#xsumm; ry0;summary


///

Освободить все используемые ресурсыB


///

&#x/sum;&#xmary;/summary


///

&#xpara;&#xm na;&#xme="; isp;&#xosin;&#xg"00;param name="disposing"
истинно, если управляемый ресурс должен быть

удален
;
иначе

ложно
.
/param



protected

override

void

Dispose(
bool

disposing)


{


if

(disposing && (components !=
null
))


{


components.Dispose();


}


base
.
Dispose
(
disposing
);


}



#region

Код, автоматически созданный конструктором форм WindoRs



///

&#xsumm; ry0;summary


///

Обязательный метод для поддержки конструктора
-

не изменяйте


///

содержимое данного метода при помощи редактора кодаB


///

&#x/sum;&#xmary;/summary


private

void

InitializeComponent()


{


this
.SuspendLayout();


//


// Form1


//


this
.AutoScaleDimensions =
new

System.Drawing.
SizeF
(6F, 13F);


this
.AutoScaleMode = System.Windows.Forms.
AutoScaleMode
.Font;


this
.ClientSize =
new

System.Drawing.
Size
(383, 335);


this
.Name =
"Form1"
;


this
.Text =
"Form1"
;


this
.ResumeLayout(
false
);



}



#endregion


}

}


Файл, сгенерированный
дизайнером форм, редко подвергается ручному редактированию͘
Единственным исключением может быть случай, когда необходима специальная обработка в
методе Dispose()͘ Метод =nitializeComponent мы обсудим позднее в этой главе͘ Если взглянуть
на этот код примера

приложения в целом, то мы увидим, что он намного длиннее, чем простой
пример командной строки͘ Здесь перед началом класса присутствует несколько операторов
using, и большинство из них в данном примере не нужны͘ Однако их присутствие ничем не
мешает͘ Класс

Form1 наследуется от

System͘Windows͘Forms͘Form, как и в предыдущем, введенном примере, но в этой точке
начинаются расхождения͘ Во
-
первых
,
в

файле

Form1.Designer
появляется

строка
:


private System.ComponentModel.IContainer components = null;


В данном при
мере эта строка кода ничего не делает͘ Но, добавляя компонент в форму, вы
можете также добавить его в объект components, который представляет собой контейнер͘
Причина добавления этого контейнера


в необходимости правильной обработки
уничтожения формы͘ Кла
сс формы поддерживает интерфейс =Disposable, потому что он
реализован в классе Component͘ Когда компонент добавляется в контейнер, то этот контейнер
должен позаботиться о корректном уничтожении своего содержимого при закрытии формы͘
Это

можно

увидеть

в

мет
оде

Dispose
нашего

примера
:


protected

override

void

Dispose(
bool

disposing)


{


if

(disposing && (components !=
null
))


{


components.Dispose();


}


base
.Dispose(disposing);


}


Здесь мы видим, что когда вызывается метод Dispose формы, то также вызывается

метод Dispose объекта components, поскольку он содержит в себе другие компоненты, которые
также должны быть корректно удалены͘

Конструктор класса Form1,
находящийся в файле Form1͘cs, выглядит так͗





public

Form1()


{


InitializeComponent();


}


Обратите

внимание

на

вызов

InitializeComponent().

Метод
InitializeComponent
() находится в файле
Form
1.
Designer
.
cs

и делает
то, что следует из
его наименования


инициализирует все элементы управления, которые могут быть
добавлены к форме͘ Он также инициализирует свойства формы͘ В нашем примере метод
InitializeComponent
() выглядит следующим образом͗




private

void

Initialize
Component()


{


this
.SuspendLayout();


this
.AutoScaleDimensions =
new

System.Drawing.
SizeF
(6F, 13F);


this
.AutoScaleMode = System.Windows.Forms.
AutoScaleMode
.Font;


this
.ClientSize =
new

System.Drawing.
Siz
e
(383, 335);


this
.Name =
"Form1"
;


this
.Text =
"Form1"
;


this
.ResumeLayout(
false
);


}


Как видите, здесь присутствует лишь базовый код инициализации͘ Этот метод связан с
визуальным дизайнером
Visual Studio͘ Когда в форму вносятся изменения в дизайнере, они
отражаются на =nitializeComponent()͘ Если вы вносите любые изменения в =nitializeComponent(),
то следующий раз после того, как что
-
то будет изменено в дизайнере, эти ручные изменения
будут ут
еряны͘ =nitializeComponent() повторно генерируется после каждого изменения дизайна
формы͘ Если возникает необходимость добавить некоторый дополнительный код для формы
или элементов управления и компонентов формы, это должно быть сделано после вызова
Initia
lizeComponent()͘ Этот метод также отвечает за создание экземпляров элементов
управления, поэтому любой вызов, ссылающийся на них, выполненный до
=nitializeComponent(), завершится возбуждением исключения нулевой ссылки͘

Чтобы добавить элемент управления или

компонент в форму, нажмите комбинацию
клавиш или выберите пункт меню View
-

Toolbox (Вид
-

Панель инструментов) в
среде Visual Studio ͘NET͘ Щелкните правой кнопкой мыши на Form1͘cs в проводнике Solution
Explorer и в появившемся контекстном ме
ню выберите пункт View Designer (Показать
дизайнер)͘ Выберите элемент управления Button и перетащите на поверхность формы в
визуальном дизайнере͘ Можно также дважды щелкнуть на выбранном элементе управления, и
он будет добавлен в форму͘ То же самое следует

проделать с элементом TextBox рис͘ 1͘1͘
Теперь, после добавления этих двух элементов управления на форму, метод
=nitializeComponent() расширяется и содержит такой код͗





private

void

InitializeComponent()


{


this
.button1 =
new

System.Windows.Forms.
Button
();


this
.textBox1 =
new

System.Windows.Forms.
TextBox
();


this
.SuspendLayout();


//


// button1


//


this
.button1.Location =
new

System.Drawing.
Point
(166, 44);



this
.button1.Name =
"button1"
;


this
.button1.Size =
new

System.Drawing.
Size
(75, 23);


this
.button1.TabIndex = 0;


this
.button1.Text =
"button1"
;


this
.button1.UseVisualStyleBackColor =
true
;



//


// textBox1


//


this
.textBox1.Location =
new

System.Drawing.
Point
(43, 44);


this
.textBox1.Name =
"textBox1"
;


this
.textBox1.Size =
new

System.Drawing.
Size
(100, 20);


this
.textBox1.T
abIndex = 1;


//


// Form1


//


this
.AutoScaleDimensions =
new

System.Drawing.
SizeF
(6F, 13F);


this
.AutoScaleMode = System.Windows.Forms.
AutoScaleMode
.Font;


this
.ClientSize =
new

System.Drawing.
Size
(383, 335);


this
.Controls.Add(
this
.textBox1);


this
.Controls.Add(
this
.button1);


this
.Name =
"Form1"
;


this
.Text =
"Form1"
;


this
.ResumeLayout(
false
);


this
.PerformLayout
();



}


Рис͘ 1͘1͘ Расположение элементов на форме


Если посмотреть на первые три строки кода этого метода, мы увидим в них создание
экземпляров элементов
управления Button и TextBox͘ Обратите внимание на имена,
присвоенные им


textBox1и button1͘ По умолчанию дизайнер в качестве имен использует имя
класса элемента управления, дополненное целым числом͘ Когда вы добавляете следующую
кнопку, дизайнер называет
ее button2 и т͘д͘ Следующая строка


часть пары
SuspendLayout/ResumeLayout͘ Метод SuspendLayout() временно приостанавливает события
размещения, которые имеют место при первоначальной инициализации элемента управления͘
В конце метода вызывается ResumeLayout
(), чтобы вернуть все в норму͘ В сложной форме с
множеством элементов управления метод =nitializeComponent() может стать достаточно
большим͘

Чтобы изменить значения свойств элемента управления, нужно либо нажать ,

либо выбрать пункт меню View
-
Propert
ies Window (Вид
-

Окно свойств)͘ Это окно позволяет
модифицировать большинство свойств элемента управления или компонента͘ При внесении
изменений в окне свойств метод =nitializeComponent() автоматически переписывается с тем,
чтобы отразить новые значения с
войств͘ Например, изменив свойство Text на My Button в окне
свойств, получим следующий код в =nitializeComponent()͗









//


// button1


//


this
.button1.Location =
new

System.Drawing.
Point
(34, 33);


this
.button1.Name =
"button1"
;


this
.button1.Size =
new

System.Drawing.
Size
(75, 23);


this
.button1.TabIndex = 0;


this
.button1.Text =
"My Button "
;


this
.button1.UseVisualStyleBackColor =
true
;


Иерархия

классов

Важность понимания иерархии становится очевидной в процессе проектирования и
конструирования пользовательских элементов управления͘ Если такой элемент управления
унаследован от конкретного библиотечного элемента управления, например, когда создается
тексто
вое поле с некоторыми дополнительными методами и свойствами, то имеет смысл
унаследовать его от обычного текстового поля и затем переопределить и добавить
необходимые методы͘ Однако если приходится создавать элемент управления, который не
соответствует ни
одному из существующих в ͘NET Framework, то его придется унаследовать от
одного из базовых классов͗ Control или ScrollableControl, если нужны возможности прокрутки,
либо ContainerControl, если он должен служить контейнером для других элементов
управления͘


Класс Control

Пространство имен System͘Windows͘Forms включает один класс, который является базовым
почти для всех элементов управления и форм


System͘Windows͘Forms͘Control͘ Он реализует
основную функциональность для создания экранов, которые видит польз
ователь͘ Класс Control
унаследован от System͘ComponentModel͘Component͘ Класс Component обеспечивает классу
Control инфраструктуру, необходимую для того, чтобы его можно было перетаскивать и
помещать на поле дизайнера, а также, чтобы он мог включать в себя
другие элементы
управления͘ Класс Control предлагает огромный объем функциональности классам,
наследуемым от него͘ Этот список слишком большой, чтобы приводить его здесь, поэтому в
данном разделе мы рассмотрим только наиболее важные возможности, предоставл
яемые
классом Control͘


Размер и местоположение

Размер и местоположение элементов управления определяются свойствами :eight, Width,
Top, Bottom, Left и Right, вместе с дополняющими их Size и Location͘ Отличие состоит в том, что
Height, Width, Top, Bottom,

Leftи Right принимают одно целое значение͘ Size принимает
значение структуры Size, а Location


значение структуры Point͘ Структуры Size и Point
включают в себя координаты X, Y͘ Point обычно описывает местоположение, а Size


высоту и
ширину объекта͘ Size
и Point определены в пространстве имен System͘Drawing͘ Обе структуры
очень похожи в том, что представляют пары координат X, Y, но, кроме того


переопределенные операции, упрощающие сравнения и преобразования͘ Вы можете,
например, складывать вместе две стр
уктуры Size͘ В случае структуры Point операция сложения
переопределена таким образом, что можно прибавить к Point структуру Size и получить в
результате Point͘ Это дает эффект прибавления расстояния к местоположению, чтобы получить
новое местоположение, чт
о очень удобно для динамического создания форм и элементов
управления͘

Свойство Bounds возвращает объект Rectangle, представляющий экранную область,
занятую элементом управления͘ Эта область включает полосы прокрутки и заголовка͘ Rectangle
также относится

к пространству имен System͘Drawing͘ Свойство ClientSize


структура Size,
представляющая клиентскую область элемента управления за вычетом полос прокрутки и
заголовка͘

Методы PointToClient и PointToScreen


удобные методы преобразования, которые
принимают
Point и возвращают Point͘ Метод PointToClient принимает структуру Point,
представляющую экранные координаты, и транслирует их в координаты текущего клиентского
объекта͘ Это удобно для операций перетаскивания͘ Метод PointToScreen выполняет обратную
операцию



принимает координаты в клиентском объекте и транслирует их в экранные
координаты͘

Методы RectangleToScreen и ScreenToRectangle выполняют те же операции, но со
структурами Rectangle вместо Point͘

Свойство Dock определяет, к какой грани родительского эл
емента управления должен
пристыковываться данный элемент͘ Перечисление DockStyle задает возможные значения этого
свойства͘ Они могут быть такими͗ Top, Bottom, Right, Left, Fill и None͘ Значение Fill
устанавливает размер данного элемента управления равным р
азмеру родительского͘

Свойство Anchor(якорь) прикрепляет грань данного элемента управления к грани
родительского элемента управления͘ Это отличается от стыковки (docking) тем, что не
устанавливает грань дочернего элемента управления точно на грань родитель
ского, а просто
выдерживает постоянное расстояние между ними͘ Например, если якорь правой грани
элемента управления установлен на правую грань родительского элемента, и если родитель
изменяет размер, то правая грань данного элемента сохраняет постоянную ди
станцию от
правой грани родителя


т͘е͘ он изменяет размер вместе с родителем͘ Свойство Anchor
принимает значения из перечисления AnchorStyle, а именно͗ Top, Bottom, Left, Right и None͘
Устанавливая эти значения, можно заставить элемент управления изменять

свой размер
динамически вместе с родителем͘ Таким образом, кнопки и текстовые поля не будут усечены
или скрыты при изменении размеров формы пользователем͘

Свойства Dock и Anchor применяются в сочетании с компоновками элементов управления
Flow и Table они

позволяют создавать очень сложные пользовательские окна͘ Изменение
размеров окна может оказаться достаточно непростой задачей для сложных форм с
множеством элементов управления͘ Эти инструменты существенно облегчают задачу͘



Внешний вид

Свойства, имеющие

отношение к внешнему виду элемента управления


это BackColor и
ForeColor, которые принимают объект System͘Drawing͘Color в качестве значения͘ Свойство
BackGround=mage принимает объект графического образа как значение͘ Класс
System.Drawing.Image


абстракт
ный класс, служащий в качестве базового для классов Bitmap
и Metafile͘ Свойство Background=mageLayout использует перечисление =mageLayout для
определения способа отображения графического образа в элементе управления͘ Допустимые
значения таковы͗ Center, Til
e, Stretch, Zoom или None͘

Свойства Font и Text работают с надписями͘ Чтобы изменить Font, необходимо создать объект
Font͘ При создании этого объекта указывается имя, стиль и размер шрифта͘


Взаимодействие с пользователем

Взаимодействие с
пользователем лучше всего описывается серией событий, которые
генерирует элемент управления и на которые он реагирует͘ Некоторые из наиболее часто
используемых событий͗ Click, DoubleClick, KeyDown, KeyPress, Validatingи Paint͘ События,
связанные с мышью


Click, DoubleClick, MouseDown, MouseUp, MouseEnter, MouseLeave и
MouseHover


описывают взаимодействие мыши и экранного элемента управления͘ Если вы
обрабатываете оба события


Click и DoubleClick


то всякий раз, когда перехватывается
событие DoubleClick, т
акже возбуждается и событие Click͘ Это может привести к
нежелательным последствиям при неправильной обработке͘ К тому же и Click, и DoubleClick
принимают в качестве аргумента EventArgs, в то время как события MouseDown и MouseUp
принимают MouseEventArgs͘ С
труктура MouseEventArgs содержит несколько частей полезной
информации


например, о кнопке, на которой был выполнен щелчок, количестве щелчков на
кнопке, количестве щелчков колесика мыши, текущих координатах X и Y указателя мыши͘ Если
нужен доступ к любой
подобной информации, то вместо событий Click или DoubleClick
потребуется обрабатывать события MouseDown и MouseUp͘ События клавиатуры работают
подобным образом͘ Объем необходимой информации определяет выбор обрабатываемых
событий͘ Для простейших случаев со
бытие KeyPress принимает KeyPressEventArgs͘ Эта структура
включает KeyChar, представляющий символ нажатой клавиши͘ Свойство :andled используется
для определения того, было ли событие обработано͘ Установив значение :andled в true, можно
добиться того, что с
обытие не будет передано операционной системе для совершения
стандартной обработки͘ Если необходима дополнительная информация о нажатой клавише, то
больше подойдут события KeyDown или KeyUp͘ Оба принимают структуру KeyEventArgs͘
Свойства KeyEventArgs включ
ают признак одновременного состояния клавиш , или
͘ Свойство KeyCode возвращает значение типа перечисления Keys, идентифицирующее
нажатую клавишу͘ В отличие от свойства KeyPressEventArgs͘ KeyChar, свойство KeyCode
сообщает о каждой клави
ше клавиатуры, а не только о буквенно
-
цифровых клавишах͘ Свойство
KeyData возвращает значение типа Keys, а также устанавливает модификатор͘ Значение
модификатора сопровождает значение клавиши, объединяясь с ним двоичной логической
операцией “ИЛИ”͘ Таким об
разом, можно получить информацию о том, была ли одновременно
нажата клавиша или ͘ Свойство KeyValue


целое значение из перечисления Keys͘
Свойство Modifiers содержит значение типа Keys, представляющее нажатые модифицирующие
клавиши͘ Если было
нажато более одной такой клавиши, их значения объединяются операцией
“ИЛИ”͘ События клавиш поступают в следующем порядке͗

1.

KeyDown

2.

KeyPress

3.

KeyUp

События
Validating
,
Validated
,
Enter
,
Leave
,
GotFocus
и
LostFocus

имеют отн
ошение к
получению фокуса элементами управления (т͘е͘ когда становятся активными) и утере его͘ Это
случается, когда пользователь нажатием клавиши переходит к данному элементу
управления либо выбирает его мышью͘ Может показаться, что события Enter, Le
ave, GotFocusи
LostFocus очень похожи в том, что они делают͘ События GotFocus и LostFocus относятся к
низкоуровневым, и связаны с событиями Windows WM_SETFOCUS и WM_K=LLFOCUS͘ Обычно
когда возможно, лучше использовать события Enter и Leave͘ События Validat
in gи Validated
возбуждаются при проверке данных в элементе управления͘ Эти события принимают аргумент
CancelEventArgs͘ С его помощью можно отменить последующие события, установив свойство
Cancel в true͘ Если вы разрабатываете собственный проверочный код,
и проверка завершается
неудачно, то в этом случае можно установить Cancel в true


тогда элемент управления не
утратит фокус͘ Validating происходит во время проверки, а Validated


после нее͘ Порядок
возникновения событий следующий͗

1.

Enter

2.

GotFocus

3.

Leave

4.

V
alidating

5.

Validated

6.

LostFocus

Понимание последовательности этих событий важно, чтобы избежать рекурсивных
ситуаций͘ Например, попытка установить фокус элемента управления внутри обработчика
события LostFocus

создает ситуацию взаимоблокировки в цикле событий
, и приложение
перестает реагировать на внешние воздействия͘

Стандартные элементы управления и компоненты

Рассмотрим различные стандартные элементы управления, поставляемые в составе ͘NET
Framework, и объясним, какую дополнительную функциональность они пре
длагают͘

Форма frmControls, содержит многие элементы управления с базовой функциональностью͘ На
рис͘ 2͘2 показан ее внешний вид͘


Рис͘ 2͘2 Форма с основными элементами

Button

Класс Button представляет простую командную

кнопку и наследуется от ButtonBase͘ Чаще
всего требует написания кода обработки события Click͘ Следующий фрагмент кода реализует
обработчик события Click͘ Когда выполняется щелчок на кнопке, появляется окно сообщения,
отображающее имя кнопки͘




private

void

button1_Click(
object

sender,
EventArgs

e)


{


MessageBox
.Show(
"
Выполнен

щелчок

на

"

+ ((
Button
)sender).Name +
"."
);


}


С помощью метода PerformClick можно эмулировать событие Click кнопки без
необходимости действительного вып
олнения щелчка пользователем͘ Метод NotifyDefault
принимает в параметре значение булевского типа и сообщает кнопке, чтобы она отобразила
себя как кнопку по умолчанию͘ Обычно кнопка по умолчанию на форме имеет слегка
утолщенную рамку͘ Чтобы идентифицировать

кнопку как кнопку по умолчанию, потребуется
установить свойство AcceptButton формы равным ссылке на эту кнопку͘ После этого, если
пользователь нажмет клавишу , сгенерируется событие Click этой кнопки по умолчанию͘
На рис͘ 2͘3 Кнопка с меткой Defaul
t (По умолчанию) является кнопкой по умолчанию (обратите
внимание на темную рамку)͘ Кнопки могут содержать на своей поверхности как текст, так и
графическое изображение͘ Изображения доступны для кнопок через объект =mageList или
свойство =mage͘



Рис͘ 2͘3 Кнопка с меткой Default

Объект =mageList представляет собой именно то, что можно предположить по его
н
азванию͗ список изображений, который управляется компонентом, помещенным на форму͘
Как Text, так и =mage имеют свойс
тво Align, предназначенное для выравнивания текста или
изображения на поверхности кнопки͘ Свойство Align принимает значения типа перечисления
ContentAlignment͘ Текст или изображение могут быть выровнены в комбинации по левой или
правой границе кнопки либо
по верхней или нижней границе͘


CheckBox

Элемент управления CheckBox

(флажок) также унаследован от ButtonBase и применяется
для принятия команды пользователя с двумя или тремя состояниями͘ Если свойство ThreeState
установлено в true, то
свойство CheckState элемента CheckBox может принимать одно из
следующих трех перечислимых значений͗



Checked



Элемент CheckBox отмечен͘



Unchecked



Элемент CheckBox не отмечен͘





В этом состоянии элемент CheckBox не доступен͘

Состояние =nde
terminate может быть установлено только программно, а не пользователем͘
Это удобно, если вы хотите сообщить пользователю, что опция не была установлена͘ Для
получения текущего состояния в виде булевского значения можно обратиться к свойству
Checked.

Собы
тия CheckedChanged и CheckStateChanged возникают, когда изменяется свойство
CheckState

или Checked͘ Перехват этих событий может пригодиться для установки других
значений на основе нового состояния CheckBox͘ В классе формы frmControls событие
CheckedChanged
для нескольких элементов CheckBox обрабатывается следующим методом͗




private

void

checkBox1_CheckedChanged(
object

sender,
EventArgs

e)


{


CheckBox

checkBox = (
CheckBox
)sender;


MessageBox
.Show(
"
Новое

значение

"

+ checkBox.Name +
"
равно

"

+


checkBox.Checked.ToString());


}


При изменении состояния каждого из этих элементов отображается окно сообщения с
именем элемента CheckBox и его новым состоянием͘


RadioButton

Последний элемент управления,
унаследованный от ButtonBase


это RadioButton
(переключатель)͘ Переключатели обычно используются в составе групп͘ Иногда называемые
кнопками выбора (option buttons), переключатели дают возможность пользователю выбирать
одну из нескольких опций͘ Когда вы
используете множество элементов управления RadioButton
в одном контейнере, выбранным может быть только один из них͘ Поэтому если у вас есть три
опции, например, Red, Green и Blue, и если выбрана опция Red, а пользователь щелкает на Blue,
то Red автоматичес
ки отключается͘ Свойство Appearance принимает значение из перечисления
Appearance͘ Оно может быть либо Button, либо Normal͘ Когда выбирается Normal, то
переключатель выглядит как маленький кружок с меткой рядом с ним͘ Выбор его заполняет
кружок, выбор друг
ого переключателя из той же группы отменяет выбор текущего выбранного
переключателя и делает его кружок пустым͘ При установке значения Appearance равным Button
переключатель выглядит подобно стандартной кнопке, но работает подобно переключателю


выбранная

кнопка нажата, не выбранная


отпущена͘ Свойство CheckedAlign определяет, где
находится кружок по отношению к тексту метки͘ Он может быть над текстом, под ним, справа
или слева͘ Событие CheckedChanged возникает всякий раз, когда значение свойства Checked
изменяется͘ Подобным образом можно выполнить другие действия на основе нового значения
элемента управления͘


ComboBox, ListBox и CheckedListBox

ComboBox, ListBoxи CheckedListBox


все унаследованы от класса ListControl͘ Этот класс
определяет некоторую базо
вую функциональность управления списками͘ Самое главное в
использовании списочных элементов управления


это добавление и выбор элементов списка͘
То, какой список нужно применять, в основном определяется тем, как его предполагается
использовать, и типом да
нных, которые в нем должны содержаться͘ Если необходимо иметь
возможность множественного выбора, или пользователю нужно видеть в любой момент
несколько позиций списка, то лучше всего подойдут ListBox или CheckListBox͘ Если же в списке
может быть выбран тол
ько один элемент за раз, то больше подойдет ComboBox͘


Прежде чем списком можно будет пользоваться, к нему нужно добавить данные͘ Это
делается добавлением объектов в ListBox͘ObjectCollection͘ Эта коллекция представлена
свойством списка =tems͘ Поскольку коллекция сохраняет об
ъекты, любой корректный тип ͘NET
может быть добавлен в список͘ Для того чтобы идентифицировать элементы, необходимо
установить два важных свойства͘ Первое из них


DisplayMember͘ Эта установка сообщает
ListControl, какое свойство вашего объекта должно быть

отображено в списке͘ Второе


ValueMember, оно указывает свойство вашего объекта, которое нужно возвратить в качестве
его значения͘ Если в список добавляются строки, то по умолчанию они и используются для
обоих этих свойств͘ Форма frmListsв примере прилож
ения показывает, как и объекты, и строки
(которые, разумеется, тоже представляют собой объекты) могут быть загружены в окно списка͘
В примере в качестве данных списка применяются объекты Vendor͘ После того, как данные
загружены в список, для их получения м
ожно использовать свойства Selected=tem и
Selected=ndex͘ Свойство Selected=tem возвращает текущий выбранный объект͘ Если список
разрешает множественный выбор, нет гарантии того, какой именно элемент будет возвращен͘
В этом случае должна использоваться колл
екция SelectObject͘ Она содержит список всех
текущих выбранных элементов списка͘ Если нужно получить элемент по определенному
индексу, то свойство =tems может быть использовано для доступа к ListBox͘ObjectCollection͘


ErrorProvider

ErrorProvider



на самом
деле не элемент управления, а компонент͘ Когда вы
перетаскиваете компонент в дизайнер форм, он отображается
в лотке компонентов под
дизайне
ром͘ Назначение ErrorProvider заключается в том, чтобы высвечивать пиктограмму
рядом с элементом управления, когда в
озникает ошибочная ситуация или не проходит
проверка͘ Предположим, что у вас есть поле TextBox, предназначенное для ввода возраста͘
Ваше бизнес
-
правило гласит, что значение возраста не должно превышать 65͘ Если
пользователь попытается ввести большее значен
ие, его нужно будет информировать, что
введен возраст, превышающий допустимый, и это следует исправить͘ Проверка правильности
введенного значения выполняется в обработчике события Validated этого текстового поля͘ Если
проверка не прошла, можно вызвать мето
д SetError, передав ссылку на тот элемент
управления, который вызвал ошибку, и когда пользователь наведет курсор мыши на
пиктограмму, будет отображен текст сообщения об ошибке͘ На рис͘ 2͘4 показана пиктограмма,
которая появляется в случае ввода в текстовое

поле недопустимого значения͘ Вы можете
создать ErrorProvider для каждого элемента управления на форме, который может быть
причиной ошибки, но если у вас очень много элементов управления, это может оказаться
слишком громоздко͘ Другой вариант


использовать

один поставщик ошибок, и в событии
проверки вызывать метод =conLocation с тем элементом управления, который вызвал проверку,
и одним из значений перечисления Error=conAlignment͘ Это значение устанавливает
выравнивание пиктограммы по элементу управления͘ З
атем следует вызвать метод SetError͘
Если нет никаких ошибочных условий, можно очистить ErrorProvider, вызвав SetErrorс пустой
строкой ошибки͘ В следующем примере показано, как это работает͘






private

void

textBox
1_
Validated
(
object

sender
,
EventArgs

e
)


{


if

�(textBox1.TextLength 0 &&
Convert
�.ToInt32(textBox1.Text) 65)


{


this
.textBox1,
String
.Empty);


}


else


{


this
.textBox1,
"Name is required."
);


}



}



Рис͘ 2͘4͘ Пиктограмма, которая появляется в случае ввода в текстовом поле недопустимого
значения


Если проверка не проходит (например, в
Возраст

введено число меньше 65), вызывается
метод Set=con поставщика ошибок errMai
n͘ Он устанавливает пиктограмму рядом с элементом
управления, не прошедшим проверку͘ Тут же устанавливается текст ошибки, так что когда
пользователь наведет курсор мыши на эту пиктограмму, то увидит сообщение,
информирующее его о том, что является причиной

неудачной проверки͘


PictureBox

Элемент управления PictureBox применяется для отображения графических изображений͘
Изображение может быть в формате BMP, WPEG, G=F, PNG, метафайла или пиктограммы͘
Свойство SizeMode использует перечисление PictureBoxSizeMo
de для определения того, как
изображение размещается в элементе управления͘ SizeMode может быть равно AutoSize,
Center=mage, Normal или Stretch=mage͘ Размер отображения PictureBo xможно изменять,
устанавливая свойство ClientSize͘ При создании PictureBox сн
ачала создается объект,
базирующийся на =mage͘


ProgressBar

Элемент управления ProgressBar (индикатор хода работ) используется для визуального
представления состояния длительного действия͘ Он уведомляет пользователя, что нечто
происходит, поэтому следует
подождать͘ Для элемента управления ProgressBar
устанавливаются значения свойств Minimum и Maximum͘ Эти свойства соответствуют
положению индикатора хода работ в крайнем левом (Minimum) и крайнем правом (Maximum)
положениях͘ Свойство Step устанавливает число
, на которое увеличивается значение при
каждом вызове метода PerformStep͘ Можно также использовать метод =ncrement и
увеличивать значение на переданную ему величину͘ Свойство Value возвращает текущее
значение ProgressBar͘ С помощью свойства Text можно инфо
рмировать пользователя о
процентной доле выполнения работы или же о количестве оставшихся до ее завершения
позиций͘ Имеется также свойство Background=mage, предназначенное для настройки внешнего
вида индикатора выполнения͘


Label

Метки Label применяются дл
я представления пользователю описательного текста͘ Текст
может иметь отношение к другому элементу управления либо к текущему состоянию системы͘
Обычно метки помещаются рядом с текстовыми полями͘ Метка предлагает пользователю
описание типа данных для ввода
в текстовое поле͘ Элемент управления Label всегда доступен
только для чтения


пользователь не может изменить значение строки в его свойстве Text͘
Однако вы можете изменять значение свойства Text программно͘ Свойство UseMnemonic
позволяет включить функцион
альность клавиши доступа͘ Когда букве в свойстве Text
предшествует символ амперсанда (&), эта буква высвечивается с подчеркиванием͘ Нажатие
клавиши в сочетании с клавишей этой буквы устанавливает фокус на следующий (в
порядке обхода) после метки элем
ент управления͘ Если свойство Text уже содержит в тексте
амперсанд, то добавление второго не вызовет подчеркивания буквы͘ Например, если текстом
метки должно быть Nuts & Bolts, то свойство должно иметь значение Nuts && Bolts͘ Поскольку
элемент управления L
abel доступен только для чтения, он не может получать фокус


вот
почему фокус передается следующему доступному элементу управления͘ По этой причине
важно помнить, что если вы используете мнемонику (т͘е͘ клавишу быстрого доступа), нужно
правильно устанавли
вать в форме порядок обхода с помощью клавиши табуляции͘ Свойство
AutoSize содержит булевское значение, указывающее на то, что Label может автоматически
изменять свой размер в соответствии со значением текста метки͘ Это может быть удобно для
многоязычных п
риложений, где длина свойства Text изменяется в зависимости от текущего
языка͘


TextBox, RichTextBox и MaskedTextBox

Элемент управления TextBox


один из наиболее часто используемых͘ TextBox, RichTextBox
и MaskedTextBoxу наследованы от TextBoxBase͘ Класс Te
xtBoxBase представляет такие свойства,
как MultiLine и Lines͘ Свойство MultiLine


булевское значение, позволяющее элементу
управления TextBox отображать текст в более чем одной строке͘ При этом каждая строка в
текстовом окне является частью массива строк͘

Этот массив доступен через свойство Lines͘
Свойство Text возвращает полное содержимое текстового окна в виде одной строки͘
TextLength


общая длина текста͘ Свойство MaxLength ограничивает длину текста
определенной величиной͘ SelectedText, SelectionLengthи
SelectionStart имеют дело с текущим
выделенным текстом в текстовом окне͘ Выделенный текст подсвечивается, когда элемент
управления получает фокус͘ TextBox добавляет множество интересных свойств͘ AcceptsReturn


булевское значение, позволяющее TextBox воспри
нимать клавишу как символ новой
строки либо активизировать кнопку по умолчанию на форме͘ Когда это свойство имеет
значение true, то нажатие создает новую строку в TextBox͘ Свойство CharacterCasingо
пределяет регистр текста в текстовом окне͘

Перечисление CharacterCasing содержит три
значения͗ Lower, Normalи Upper͘ Значение Lower переводит в нижний регистр весь текст,
независимо от того, как он был введен, Upper переводит весь текст в верхний регистр, а Normal
отображает текст так, как он был
введен͘ Свойство PasswordChar позволяет указать символ,
который будет отображаться при вводе пользователем всех символов в текстовом окне͘ Это
применяется при вводе паролей и P=N
-
кодов͘ Свойство text вернет действительный введенный
текст͖ свойство Password
Char касается только отображения символов͘

RichTextBox


элемент управления, служащий для редактирования текста с расширенными
возможностями форматирования͘ Как следует из его названия, RichTextBox использует Rich Text
Format (RTF) для обработки специальн
ого форматирования͘ Изменения формата
обеспечивается свойствами SelectionFont, SelectionColor и SelectionBullet, а форматирование
параграфов


свойствами Selection=ndent, SelectionRight=ndent и Selection:anging=ndent͘ Все
свойства их группы Selection работ
ают одинаково͘ Если выделена часть текста, то изменение
свойства касается этого выделенного фрагмента͘ Если же выделенного фрагмента нет, то
изменения затрагивают любой текст, вставляемый справа от текущей позиции вставки͘ Текст
данного элемента управления

может быть извлечен из свойства Text либо Rtf͘ Свойство Text
возвращает простой текст элемента управления, в то время как Rtf


форматированный текст͘


Panel

Panel


простой элемент
управления, содержащий в себе другие элементы управления͘ За
счет группирования вместе элементов управления и помещения их в панель существенно
упрощается управление ими͘ Например, можно сделать недоступными все элементы
управления в панели, просто сделав
недоступной всю панель͘ Поскольку Panel наследуется от
ScrollableControl, также можно воспользоваться преимуществами AutoScroll͘ Если в пределах
доступной области нужно отобразить слишком много элементов управления, поместите их в
панель и установите значе
ние true свойству AutoScroll


после этого их можно будет
прокручивать в пределах этой области͘ Панели по умолчанию не отображают рамки, но,
присвоив значение свойству BorderStyle, можно визуально группировать взаимосвязанные
элементы управления посредством

рамок͘ Это делает пользовательский интерфейс более
дружественным͘


TabControl и TabPages

TabControl позволяет группировать связанные элементы управления в серии страниц
-
вкладок͘ TabControl управляет коллекцией элементов типа TabPages͘ Несколько свойств
у
правляют внешним видом TabControl͘ Свойство Appearance использует перечисление
TabAppearance для определения внешнего вида вкладок͘ Допустимыми значениями являются
FlatButtons, Buttonsи Normal͘ Свойство Multiline булевского типа указывает на то, что может
отображаться более одной строки вкладок͘ Если свойство Multiline установлено в false, а
количество вкладок превышает такое, что не может уместиться на экране, появляется пара
кнопок, позволяющая прокручивать вкладки и видеть те, что не уместились͘ Свойство

Text
элемента TabPage


это то, что отображается на отдельной вкладке͘ Свойство Text
устанавливается через параметр конструктора͘ Создав элемент управления TabPage, вы
получаете контейнер, куда можно помещать другие элементы управления͘ Средствами
дизайнер
а Visual Studio ͘NET легко добавить элемент TabPage к элементу управления
TabControl, используя редактор коллекций͘ При добавлении каждой такой страницы можно
установить множество ее свойств, затем перетащить на нее другие дочерние элементы
управления͘ Пол
учить текущую вкладку можно из свойства SelectedTab͘ Событие Selected=ndex
возникает при каждом переключении вкладки͘ Прослушивая свойство Selected=ndex и затем
подтверждая текущий выбор страницы через SelectedTab, вы можете организовать
специальную обрабо
тку для каждой вкладки͘ Вы могли бы, к примеру, управлять данными,
отображаемыми для каждой вкладки͘




ContextMenuStrip

Класс ContextMenuStrip применяется для показа контекстного меню, или меню,
отображаемого по нажатию правой кнопки мыши͘ Подобно MenuStr
ip, ContextMenuStrip
является контейнером объектов ToolStripMenu=tem͘ Однако он унаследован от
ToolStripDropDownMenu͘ Элемент ContextMenuStrip создается так же, как MenuStrip͘ К нему
добавляются элементы ToolStripMenu=temи определяются события Click каждог
о элемента для
выполнения специфического действия͘ Контекстное меню назначается конкретному элементу
управления͘ Это делается установкой свойства ContextMenuStrip элемента управления͘ Когда
пользователь щелкает правой кнопкой мыши в поле элемента управлени
я, отображается
упомянутое меню͘

4.

Содержание отчёта

Отчёт должен содержать

название и цель͘
В
ыполненн
ые

задани
я

из ПРИЛОЖЕНИЕ А͘

Выводы͘



5.

Контрольные вопросы

1.

Особенности построения приложений на

C#
?

2.

Для чего используется компонент
Label
;

3.

Для чего используется компонент
B
utton
;

4.

Для чего используется компонент
CheckBox
;

5.

Для чего используется компонент
E
rrorProvider
;

6.

Для чего используется компонент
ListBox
;

7.

Для чего используется компонент
Tab
Control
;

8.

Для чего используется компонент
Panel
;

9.

Для чего используется компонент
RadioButton
;

10.

Какие компоненты используются для создания меню на форме
;

ПРИЛОЖЕНИЕ А


1.

Создать
калькулятор
, который полностью повторяет
обычный калькулятор

Windi
ws
.
Интерфейс должен быть аналогичен рис͘ 2͘5͘

Необходимо, чтоб
программа

отображала
ошибки
пользователя
.


Р
ис͘ 2͘5͘

Обычный к
алькулятор
Windows


2.

Добавить в калькулятор функции согласно варианту и вид калькулято
ра должен
изменяться по событию, на вид
р
ис͘ 2͘6͘

Используйте для решения поставленной з
адачи
два дополнительных компонента из библиотеки
, которые не изображены на

р
ис͘ 2͘6͘

Необходимо, чтоб
ы

программа

отображала ошибки
пользователя

с использованием

E
rrorProvider
.





Р
ис͘ 2͘5͘

Обычный к
альку
лятор
Windows

с дополнительн
ой функцией



ВАРИАНТА

ФУНКЦИЯ

1

Добавить две кнопки для расчета
X
2
, %


2

Добавить две кнопки для расчета 1/
x
,
cos
(
x
)

3

Добавить две кнопки для расчета
X
3
, 10
x

4

Добавить две кнопки для расчета
X
y
,
Pi

5

Добавить две кнопки для расчета
sin
(
x
),
n
!

6

Добавить функцию
преобразования величин Вес (Граммы в Караты) и обратно͘

7

Добавить функцию преобразования величин Время (Год в Минуты) и обратно͘

8

Добавить функцию преобразования величин Давление (Атмосферы в Бары) и
обратно͘

9

Добавить функцию преобразования велич
ин Длина (Сантиметры в Дюймы) и
обратно͘

10

Добавить функцию преобразования величин Мощность (Ватт в Киловатт) и
обратно͘

11

Добавить функцию преобразования величин Объем (Литр в Британскую пинту) и
обратно͘

12

Добавить функцию преобразования величин Площадь (Гектары в Квадратные
метры) и обратно͘

13

Добавить функцию преобразования величин Скорость (Узлы в Километр час) и
обратно͘

14

Добавить функцию преобразования величин Темпера
тура

(Градусы Цельсия в
Граду
сы Фаренгейта) и обратно͘

15

Добавить функцию преобразования величин Угол (
Градусы

в
Радианы
) и обратно͘

16

Добавить функцию преобразования величин Энергия (Калория в Джоуль) и
обратно͘

17

Добавить функционал расчета ипотеки͘

18

Написать логическое
выражение для расчета суммы выплаты по депозиту на
вклад͗ до 5000 грн͘ начисляется 20% годовых, от 5000 грн͘ до 10000 грн͘
-

22%
годовых͘ Все данные должны вводится с элементов форм͘

19

Добавить в калькулятор расчет
уравнения
ax
2
+
bx
+
c
=0.

20

Добавить в
калькулятор три основных тригонометрических функций на выбор͘




Приложенные файлы

  • pdf 1046988
    Размер файла: 786 kB Загрузок: 1

Добавить комментарий