Объектно-ориентированный подход



Pdf просмотр
страница1/9
Дата24.12.2016
Размер1.73 Mb.
Просмотров1181
Скачиваний0
  1   2   3   4   5   6   7   8   9

Государственный университет – Высшая школа экономики


Факультет Бизнес-Информатики


Кафедра Основ информатики и прикладного программного обеспечения









C#
Объектно-ориентированный язык программирования

Пособие к практическим занятиям -
9







Проф. Забудский Е.И.







Москва 2006

Тема 9
. Объектно-ориентированный подход

к разработке программного обеспечения.
System.Windows.Forms
Visual Studio .NET
Графический Интерфейс Пользователя –
G
raphical
U
ser
I
nterface (
GUI
).
Два практических занятия
(4 часов)
1.
Разработка проекта NetCalc (Калькулятор) с использованием встроенного дизайнера форм
– средство автоматизации разработки
Visual Studio .NET (листинг 9.9
NetCalc.cs
).
2.
Разработка вручную восьми приложений Windows Forms в формате
GUI
(листинги 9.1…9.8)
За
компонентно
-ориентированным программированием – будущее
(см. листинги 4.5 - 4.10 – Материалы к Практич. занятию № 4)
//
КОММЕНТАРИЙ
. На сайте http://www.firststeps.ru/
“Первые шаги” представлено много интерес- ных обучающих материалов по различным интeгрированным средам и языкам программирова- ния, в том числе представлены C# и платформа .NET (
step by step
).
Данное пособие распространяется свободно. Изложенный материал, предназна- ченный для публикации в “твердом” варианте, дополнен и откорректирован.






©
Забудский Е.И., 2006

3

Содержание
1.
Программная модель Windows Forms ……………………………………………………………
4
1.1.
Ваша первая Windows-форма.

Листинг
9.1. Hello.cs,
Puc. 2а,б ……………………………..
5
1.2.
Рисование внутри формы: GDI+ …………………………………………………………………..
7
1.2.1.
Рисование линий, кривых и фигур. Таблица
Графические примитивы GDI+, Puc.3 …….
7

Таблица
Методы класса Graphics для рисования линий, кривых и фигур …………………
8
1.2.2.
Освобождение объектов GDI+ ……………………………………………………………………..
9
1.2.3.
Координаты и преобразования.
Листинг
9.2.
Clock.cs,
Puc. 4…Puc. 7 ……………………..
9
1.2.4.
Единицы измерения,
Puc. 9 ………………………………………………………………………...
14
1.3.
Меню. Таблица
Классы меню из System.Windows.Forms ……………………………………
16
1.3.1.
Главные меню ………………………………………………………………………………………...
16
1.3.2.
Обработка команд меню ……………………………………………………………………………
17
1.3.3.
Контекстные меню ……………………………………………………………………………………
17
1.3.4.
Состояния пунктов меню ……………………………………………………………………………
18
1.3.5.
«Быстрые» клавиши …………………………………………………………………………………
19
1.4.
Приложение ImageView.
Листинг 9.3.
lmageView.cs, рис. 10а,б,в ……………………………..
19
1.5.
Мышь и клавиатура. Таблица
Виртуальные методы формы для обработки сигналов от мыши и с клавиатуры …………………………………………………………………………….
24
1.5.1.
Обработка ввода с клавиатуры ……………………………………………………………………
25
1.5.2.
Обработка сигналов от мыши.
Листинг
9.4.
MouseTracker.cs,
рис. 11 ……………………….
25
1.5.3.
Приложение NetDraw.
Листинг
9.5.
NetDraw.cs,
рис. 13 ………………………………………...
28
1.6.
Другие события формы. Таблица
Виртуальные методы, соответствующие событиям
формы. Листинг
9.6.

CloseDemo.cs,
рис. 15 ………………………………………………………
31
1.7.
Элементы управления.
Таблица
Классы элементов управления из
System.Windows.Forms ……………………………………………………………………………...
33
1.7.1.
Приложение
ControlDemo.
Листинг
9.7.

ControlDemo.cs, рис. 17 …………………………..
35
1.8.
Привязки. Таблица
Стили привязки, рис. 19, рис. 20 …………………………………………
38
1.9.
Диалоговые окна. Таблица
Классы стандартных диалогов, определенные в
System.Windows.Forms ……………………………………………………………………………..
40
1.9.1.
Приложение DialogDemo.
Листинг
9.8.

DialogDemo.cs, рис. 21а,б …………………………
40
2.
Windows Forms
и Visual Studio .NET,

рис. 23 ……………………………………………
48

Шаг 1:
Создание проекта
NetCalc
,
рис. 24 ……………………………………………………...
49

Шаг 2:
Разработка формы
,
рис. 25
,
рис. 26 ……………………………………………………
49

Шаг 3:
Добавление полей …………………………………………………………………………..
51

Шаг 4:
Изменение конструктора класса формы ………………………………………………...
52

Шаг 5:
Добавление вспомогательных методов …………………………………………………
52

Шаг 6:
Добавление обработчиков событий Click ……………………………………………….
52

Шаг 7:
Добавление обработчиков для клавиатуры …………………………………………….
52

Шаг 8:
Переопределение ProcessDialogKey …………………………………………………….
53

Шаг 9:
Компоновка и запуск приложения ………………………………………………………...
53

Листинг
9.9
NetCalc.cs. Исходный текст NetCalc
……………………………………………...
54

Заключение ……………………………………………………………………………………………
70

Литература …………………………………………………………………………………………….
70

4
Windows Forms

и

Visual Studio
Microsoft .NET Framework
— платформа, ориентированная в основном на разработку
Web
-приложений и
Web
- сервисов, но она поддерживает и иные программные модели. Программная модель
Windows Forms

применяется для разработки приложений
.NET Framework
с графическим интерфейсом пользователя.
Внешне приложения
Windows Forms похожи на обычные
Windows
-приложения. В них есть окна и часто исполь- зуются такие элементы приложений с графическим интерфейсом пользователя, как меню, элементы управле- ния и диалоговые окна. По сути же они являются управляемыми приложениями. Они содержат общий проме- жуточный язык (
CIL
) и метаданные, используют библиотеку классов
.NET Framework (FCL)
и выполняются в общеязыковой исполняющей среде (
CLR
).
Главное достоинство применения модели
Windows Forms
в разработке
Windows
-приложений в том, что эта мо- дель стандартизирует пользовательский интерфейс и при этом лишена массы ошибок и нестыковок, которыми грешит
Windows API
. Так, каждый опытный
Windows
-программист знает, что некоторые оконные стили можно применить только при создании окна.
Windows Forms устраняет эту проблему. Если вы применяете такой стиль к существующему окну, инфраструктура незаметно уничтожит это окно и воссоздаст его с указанным стилем.
Кроме того,
FCL
гораздо богаче
Windows API,
и, когда вы пишете приложение
Windows Forms
, в вашем распо- ряжении вся мощь
FCL.
Как правило, приложения
Windows Forms компактнее соответствующих
Windows
- приложений. Например, приложение, применяющее стандартный
Windows API
требует сотен строк кода
(или библиотеку стороннего производителя) для извлечения изображения из
JPEG
-файла. В приложении
Windows
Forms потребуется лишь одна строка (см. раздел 1.4, с.19,сл.).
1. Программная модель Windows Forms
В
Windows Forms термин форма — синоним окна. Главное окно приложения является формой
. Если у прило- жения есть другие окна верхнего уровня, они также являются формами. Диалоговые окна — тоже формы. Не- смотря на свое название, приложения
Windows Forms не выглядят как просто формы. Они, как и традиционные
Windows
-приложения, осуществляют полный контроль над всем происходящим в их окнах. Приложения
Windows Forms в большой степени зависят от классов
FCL
из пространства имен
System.Windows.Forms
, вклю- чающего такие классы:
1)
как
Form
, который моделирует поведение окон или «форм»
;
2)
Menu
, который по- зволяет работать с меню;
3)
и
Clipboard
, который предоставляет управляемый интерфейс к системному буферу обмена.
System.Windows.Forms
также содержит множество классов для элементов управления
, которые назы- ваются
Button, TextBox, ListView и MonthCalendar
.
В основе почти каждого приложения
Windows Forms лежит класс, производный от
System.Windows.Forms.
Form
.
Экземпляр этого производного класса
Form представляет главное окно приложения
. Он наследует от
Form

массу свойств и методов, обеспечивающих формам богатый программный интерфейс. Хотите узнать размеры клиентской области формы
?
В
Windows вам надо вызывать
API
-функцию
GetClientRect, а

в Windows Forms достаточно прочитать свойство ClientRectangle или ClientSize формы
. Многие свойства можно не только чи- тать, но и устанавливать. Так, стиль границы окна можно изменить, задав свойство
BorderStyle
, размер окна меняется через свойства
Size
или
ClientSize
, а текст заголовка формы — посредством свойства
Text
.
Другим важным строительным блоком приложений
Windows Forms является класс
Application
пространства имен
System.Windows.Forms
. У него есть статический метод
Run
, управляющий приложением
Windows Forms с помощью конвейера сообщений. Вы этот конвейер, конечно, не увидите — обработка сообщений скрыта
.NET
Framework.
Но он существует и является одной из многочисленных деталей, о которых вам не нужно беспоко- иться — ведь о них заботится инфраструктура
!
Многие приложения
Windows Forms связаны и с классами из пространства имен
System.Drawing
, которое содержит классы-оболочки интерфейса графических устройств
GDI+ (Graphics Device Interface+)
. Такие классы, как
Brush и Реn
представляют логические объекты, связанные с рисованием. Они определяют вид прямых, кривых и областей с заливкой. Классы
Bitmap и Image
представ- ляют изображения и умеют импортировать их из файлов разных типов, включая
BMP
,
GIF
и
JPEG
, Но важней- ший класс в System.Drawing — Graphic s
. В
Windows Forms он эквивалентен контексту устройства
Windows
. Что- бы нарисовать линию на форме, вызовите метод
DrawLine объекта
Graphics
, а для вывода строки текста —
DrawString
.
Graphics
содержит богатый набор методов и свойств для графического вывода на форму или дру- гое устройство (такое как принтер), которое связано с объектом
Graphics
.

5
1.1. Ваша первая Windows-форма
Лучшим знакомством с новой платформой будет приложение «
Hello, world
». (Из приложений «
Hello, world
» воз- никали целые компании!) Версия
«Hello, world» для Windows Forms показана на рис. 1, а результат ее работы
— на рис. 2
а
(см. также рис. 2б, рис. 3…рис. 6)
Листинг

9.1.
Hello.cs

1:
using
System;
// Prosiz, гл. 4, стр. 87, Hello
2:
using
System.Drawing;
3:
using
System.Windows.Forms;
4:
5: namespace
WindAppl_Pros_Chap4_c87_Hello
6: {
7:



class

MyForm
:
Form
8: {
9: MyForm()
10: {
11: Text =
"Windows Forms Demo"
;
// свойство
Text

12: }
13:
14:
protected

override

void
OnPaint(
PaintEventArgs
e)
15: {
16:
e.Graphics.DrawString(
"Hello, world"
, Font,
17:

new

SolidBrush
(
Color
.Black), ClientRectangle);
18: }
19:
20:
static

void
Main()
21: {
22:
Application
.Run(
new

MyForm
());
23: }
24: }
26: }
Рис. 1. Исходный текст Hello.cs
Я Windws Forms Demo
Puc. 2а. Программа «Hello, world» для Windows Forms
В приложении
Windows Forms каждая форма представлена экземпляром класса, производного от Form. В
Hello.cs
— это класс
МуFоrm (
строка 7
)
. Конструктор
MyForm
изменяет текст заголовка формы
(
строка
11
)
,

6
присваивая строку свойству
Text (см. диагр. классов)
.
Text
это одно из более чем сотни свойств
, унаследо- ванных
МуFогm от Form
. Каждый
Windows
-программист знает, что окна получают сообщения
WM_PAINT
и что большая часть вывода на экран происходит при обработке этих сообщений. В
Windows Forms эквивалентом сообщения
WM_PAINT
является виртуальный метод
OnPaint

(см.
строку 14 и
диагр. классов) класса
Form
.
Производный класс может переопределить его для отображения себя в ответ на сообщение
WM_PAINT
Вариант
OnPaint
в
MyForm
(обратите внимание на ключевое слово override
, указывающее компилятору
С#
, что вы переопределяете виртуальный метод, унаследованный от базового класса, а не скрываете его) выводит
«
Hello, world
» в клиентскую область формы — часть формы внутри рамок и заголовка окна.
OnPaint
получает объект
PaintEventArgs(System.Windows.Forms.PaintEventArgs)
, содержащий свойства
Graphics
и
ClipRectangle
:
первое хранит ссылку на объект
Graphics
, используя который,
OnPaint
рисует в клиентской области формы;
второе
— ссылку на объект
Rectangle (System.Drawing.Rectangle)
, задающий часть клиентской области, кото- рая должна быть перерисована.
Для рисования
MyForm.OnPaint
использует метод
Graphics.DrawString (см.
строка 16).
Первый параметр
DrawString
это сама выводимая строка.
Второй
— объект
Font (System.Drawing.Font)
, описывающий шрифт текста.
MyForm.OnPaint
использует шрифт по умолчанию, ссылка на который хранится в свойстве
Font
класса
Form
.
Третий
— это объект
Brush (System.Drawing.Brush)
. задающий цвет текста. Здесь используется черный объект
SolidBrush (System.DrawingSolid.Brush)
, поэтому выводится черный текст.
Четвертый и последний па-
раметр
— это форматирующий прямоугольник, который определяет расположение текста
MyFormOnPaint
ис- пользует для этого всю клиентскую область формы, определяемую свойством
ClientRectangle
. Так как
DrawText

по умолчанию выводит текст в левом верхнем углу форматирующего прямоугольника, то слова «
Hello, world
» появятся в левом верхнем углу формы.
Чтобы расположить слова «
Hello, world
» в центре окна, следует использовать альтернативную форму
DrawString
, которая принимает как входной параметр объект
StringFormat
, и инициализировать свойства
Alignment
и
LineAlignment
этого объекта, дабы обеспечить горизонтальное и вертикальное центрирование стро- ки. Вот модифицированная версия
OnPaint.
Результат модифицированной программы работы — на рис. 2
б
protected

override

void
OnPaint (PaintEventArgs
e
)
{
StringFormat format =
new
StringFormat();

format
.Alignment = StringAlignment.Center;
format
.LineAlignment = StringAlignment.Center;
e
.Graphics.DrawString (
"Hello, world"
, Font,
new
SolidBrush(Color.Black), ClientRectangle,
format
);
}
Puc. 2б. Программа «Hello, world» для Windows Fortns
Последний член
MyForm
статический метод
Main. Main
это точка входа приложения. Чтобы форма появи- лась на экране, нужно лишь создать экземпляр класса
MyForm
и передать ссылку па него в вызове
Application.Run.
На рис. 1 оператор:

7
Application.Run(
new
MyForm());
создает объект
MyForm и выводит форму на экран.
После того, как вы ввели код на рис. 1 и сохранили его в файле
Hello.cs
, его нужно скомпилировать. Откройте окно командной строки, перейдите в каталог, где располагается Hello.cs, и введите: csc
/target:
winexe hello.cs
Параметр
/target
указывает компилятору, что нужно создать приложение с графическим пользовательским интерфейсом (а не консольное приложение или, скажем,
DLL
). Полученный исполняемый файл называется
Hello.exe
1.2. Рисование внутри формы: GDI+
Создание приложений
Windows Forms с богатыми графическими возможностями требует изучения
Graphics
и других классов, предоставляющих управляемому коду доступ к Windows
GDI+. GDI
существовал в
Windows с версии
1.
GDI+
— это расширенная версия
GDI,
доступная в системах, где установлена
Windows XP
или
.NET
Framework.
Одно из различий между
GDI
и
GDI+
— поддержка в последней
градиентных кистей
(gradient brush), фунда- ментальных сплайнов и других графических средств. Но главное — разные модели программирования. В от- личие от
GDI
, использующей модель с сохранением состояния,
GDI+
обычно состояния не запоминает. В тра- диционном
Windows
-приложении такие параметры, как шрифт и цвет текста устанавливаются для контекста устройства. В приложении
Windows Forms
- нет. Здесь параметры, определяющие характеристики выводимых результатов, передаются при вызове каждого метода
Graphics.
Пример этого вы видели в программе из пре- дыдущего раздела, которая для задания шрифта и цвета текста передавала методу
DrawString объекты
Font
и
SolidBrush
.
1.2.1. Рисование линий, кривых и фигур
Font и
SolidBrush
это графические примитивы, используемые для управления форматом изображения, вы- водимого в окно формы. Но это не единственные примитивы, которые
GDI+
предоставляет в ваше распоряже- ние. Вот еще:
Графические примитивы GDI+
Класс
Описание
Bitmap
Представляет растровые изображения

Font
Определяет атрибуты шрифта: размер, гарнитуру и т. д

HatchBrush
Определяет заливку решетчатым узором

LinearGradientBrush
Определяет заливку с линейным градиентом

Реn
Определяет внешний вид линий и кривых

SolidBrush
Определяет заливку сплошным цветом

TextureBrush
Определяет заливку с использованием растрового изображения


Некоторые из этих классов определены в пространстве имен
System.Drawing
, другие — в пространстве имен
System.Drawing.Drawing2D (
NB
)
. Перья, представленные экземплярами класса
Реп
, управляют внешним видом линий и кривых. Объект
Font
задают внешний вид текста, тогда как кисти, представленные объектами классов
HatchBrusb, LinearGradientBrush, SolidBrush
и
TextureBrusb
определяют виды заливки. Приведенный ниже ме- тод
OnPaint рисует прямоугольники трех стилей:
1) без заливки,
2)
закрашенный красным цветом и
3)
с гради- ентной заливкой, переходящей из красного в синее:
protected

override

void
OnPaint (PaintEventArgs
e
)
{
Pen pen =
new
Pen(Color.Black);
// Нарисовать пустой прямоугольник.
e
.Graphics.DrawRectangle(pen, 10, 10, 390, 90);

8
// Нарисовать прямоугольник со сплошной заливкой.
SolidBrush solid =
new
SolidBrush (Color.Red);
e
.Graphics.FilLRectangle (solid, 10, 110, 390, 90);
e.
Graphics.DrawRectangle (pen, 10, 110, 390, 90);
// Нарисовать прямоугольник с градиентной заливкой.
Rectangle rect =
new
Rectangle (10, 210, 390, 90);
LinearGradientBrush gradient =
new
LinearGradientBrush (rect, Color.Red,
Color.Blue, LinearGradientMode.Horizontal);
e
.Graphics.FillRectangle (gradient, rect);
e
.Graphics.DrawRectangle (pen, rect);
}
Рис. 3. Прямоугольники различных стилей
Результаты показаны на рис. 3. Объект
Реn
, передаваемый
DrawRectangle
, обводит каждый прямоугольник черной линией толщиной в
1
единицу. (По умолчанию 1 единица — это один пиксел, поэтому все линии в дан- ном примере имеют ширину в 1 пиксел.) Кисти, передаваемые
FillRectangle
, управляют заливкой внутренней части прямоугольников. Заметьте: рамки и заливки рисуются по отдельности. Ветеранам
Windows
- программирования это будет особенно интересно, так как функции
Windows GDI
для рисования замкнутых фи- гур рисуют рамку и выводят заливку одновременно,
Класс
Graphics
содержит разнообразные открытые методы
Draw и Fill
для рисования линий, кривых, прямо- угольников, эллипсов и других фигур. Неполный список приведен в таблице. Документация
.NET Framework
SDK
содержит превосходный трактат по
GDI+
и снабжена примерами рисования объектов — от простых линий до самых сложных фигур с заливкой.
Методы класса Graphics для рисования линий, кривых и фигур
Метод
Описание
DrawArc
Рисует дугу


Поделитесь с Вашими друзьями:
  1   2   3   4   5   6   7   8   9


База данных защищена авторским правом ©nethash.ru 2019
обратиться к администрации

войти | регистрация
    Главная страница


загрузить материал