Jeff Prosise, Microsoft Corp.
Введение
Чтобысоздать GUI приложения в Microsoft .NET нужно использовать Windows Forms.Windows Forms — новый стиль построения приложения на базе классов .NETFramework class library. Они имеют собственную модель программирования, котораяболее совершеннее, чем модели, основанные на Win32 API или MFC, и онивыполняются в управляемой среде .NET Common Language Runtime (CLR). Эта статьядает представление о том, что такое Windows Forms, рассматривая ее от моделипрограммирования до Microsoft Intermediate Language и JIT-транслятора.
Выуже много слышали, что Microsoft .NET — новая платформа, которая основана наWindows. Это целая новая парадигма программирования, которая изменит путь,которым вы сейчас думаете о написании программ для Windows. Она реализована набиблиотеке классов .NET Framework class library и содержит более единую модельпрограммирования, улучшенную защиту и более богатые возможности для написанияполнофункциональных веб-приложений. И это только начало.
WindowsForms — одна из наиболее интересных возможностей Microsoft .NET. Если вызнакомы с MFC (или Windows API), то Windows Forms хорошее начало для работы с.NET Framework class library, потому что она позволяет писать традиционные GUIприложения с окнами, формами и т.п. вещами. Однажды, начав работать с WindowsForms вы сможете быстро понять .NET Framework.
Главнаявыгода от написания Windows-приложений с использованием Windows Forms — это то,что Windows Forms гомогенизируют (создают более однородную (гомогенную)структуру) программную модель и устраняют многие ошибки и противоречия отиспользования Windows API. Например, каждый опытный программист под Windowsзнает, что некоторые стили окна могут применяться только к окну, когда оно ужесоздано. Windows Forms в значительной степени устраняют такое противоречие.Если вы хотите существующему окну задать стиль, который может быть присвоентолько в момент создания окна, то Windows Forms спокойно уничтожит окно и вновьсоздаст его с указанным стилем. Кроме того, .NET Framework class libraryнамного более богаче, чем Windows API, и когда вы будете писать приложения,используя Windows Forms, вы получите в распоряжение больше возможностей.Написание приложения с использованием Windows Forms потребует меньшегоколичества кода, чем приложения, которые используют Windows API или MFC.
Другаявыгода от Windows Forms — вы используете тот же самый API, независимо от языкапрограммирования, который вы выбрали. В прошлом, выбор языка программированияуправлял выбором API. Если вы программировали в Visual Basic, вы использовалиодин API (реализованный на языке Visual Basic), в то время как программисты Cиспользовали Win32 API, а программисты C++, вообще говоря, использовали MFC.MFC-программисту было трудно переключиться на Visual Basic и наоборот. Нотеперь такого больше нет. Все приложения, которые используют Windows Forms,используют один API из .NET Framework class library. Знание одного APIдостаточно позволит программисту писать приложения фактически на любом языке,который он выберет.
WindowsForms ни как не меньше, чем современная модель программирования для GUIприложений. В отличие от модели программирования Win32, в которой многое идетеще от Windows 1.0, новая модель была разработана с учетом всех современныхтребований. Цель этой статьи состоит в том, чтобы познакомить читателя с модельюпрограммирования Windows Forms. Чтобы компилировать и выполнять примеры кода,приведенного далее, на вашем компьютере должнен быть установлен пакет Microsoft.NET Framework SDK (.NET Framework SDK Beta 1 доступен на сайте Microsoft).
Модель программирования Windows Forms
ВWindows Forms термин «форма» — синоним окна верхнего уровня. Главноеокно приложения — форма. Любые другие окна верхнего уровня, которые имеетприложение — также формы. Окна диалога также считаются формами. Несмотря наназвание, приложения, использующие Windows Forms, не выглядят как формы.Подобно традиционным Windows-приложениям приложения осуществляют полныйконтроль над событиями в собственных окнах.
Программистывидят Microsoft .NET через линзу .NET Framework class library. Представьте MFCна порядок больше и вы получите точную картину о ширине и глубине .NETFramework class library. Чтобы облегчить противоречия в обозначениях и придатьорганизацию многим сотням классов, .NET Framework class library разбита наиерархические разделы по именам. Корневой раздел, System, определяетфундаментальные типы данных, используемые всеми приложениями .NET.
Приложения,использующие Windows Forms используют классы System.WinForms. Этот разделвключает такие классы, как Form, который моделирует поведение окон или форм;Menu, который представляет меню; Clipboard, который дает возможностьприложениям Windows Forms использовать буфер обмена. Он также содержитмногочисленные классы, предоставляющие средства управления, например: Button,TextBox, ListView, MonthCalendar и т.д. Эти классы могут быть включены вприложение либо с использованием только имени класса, либо с использованиемполного имени, например: System.WinForms.Button.
Воснове почти каждого приложения, написанного с применением Windows Forms, — производный класс от System.WinForms.Form. Образец этого класса представляетглавное окно приложения. System.WinForms.Form имеет множество свойств иметодов, которые имеют богатый программный интерфейс к формам. Хотите знатьразмеры клиентской области формы? В Windows вы вызвали бы функцию API GetClientRect. В Windows Forms нужноиспользовать свойства ClientRectangle или ClientSize.
Приложения,основанные на Windows Forms, которые используют кнопки, списки и другие типыкомпонентов Windows, используют классы управления System.WinForms, значительноупрощающие программирование управления. Хотите создать стилизованную кнопку сизображением в виде фона? Нет проблем. Включите требуемое изображение в объектSystem.Drawing.Bitmap и назначьте его свойству кнопки BackgroundImage. Какнасчет управления цветом? Вы когда-либо пробовали настраивать цвет фонатекстового поля? В Windows Forms это просто: нужно просто присвоить цветсвойству BackColor, все отстальное система сделает сама.
Другойважный «строительный» блок приложения, который использует WindowsForms — класс System.WinForms по имени Application. Этот класс содержитстатический метод Run, который загружает приложение и отображает окно.
Выскажете: если приложения, которые являются Windows Forms, не обрабатываютсообщения, как они отвечают на пользовательский ввод или знают когда рисовать?Много классов имеют виртуальные методы, которые можно переопределить…Например, System.WinForms.Form содержит виртуальный метод OnPaint, которыйвызывается когда клиентская область формы нуждается в обновлении. OnPaint — один из многих виртуальных методов, который можно переопределить в производномклассе для формирования интерактивных форм.
Другаяважная грань модели программирования Windows Forms — механизм, который формыиспользуют для ответа на ввод в меню, средств управления и других элементов GUIприложения. Традиционные Windows-приложения обрабатывают сообщения WM_COMMAND иWM_NOTIFY используя события процесса Windows Forms. В C# и на других языках,которые поддерживают .NET Common Language Runtime (CLR), события — члены типапервого класса наравне с методами, полями и свойствами.
Фактически всеуправляющие классы (control classes) Windows Forms (а также и многиенеуправляющие классы) создают события. Например, кнопка (экземплярSystem.WinForms.Button) после нажатия создает событие Click. Форма, котораядолжна ответить на нажатие кнопки может использовать следующий код, чтобысоединить кнопку на обработчиком события Click:
MyButton.Click += new EventHandler (OnButtonClicked);
...
private void OnButtonClicked (object sender, EventArgs e)
{
MessageBox.Show («Click!»);
}
EventHandler — специальный обработчик событий, который выполняет метод OnButtonClicked когда MyButton создает событие Click. Первыйпараметр OnButtonClicked идентифицирует объект, который вызвал событие. Второйпараметр в основном бессмысленен для события Click, но используется некоторымдругие типами событий, чтобы передать дополнительную информацию.
Приложение«Hello World» сWindows Forms
Самыйпростой способ начать изучение новой платформы — создание приложения«Hello World». В Листинге 1 показана версия, созданная при помощиWindows Forms. Все примеры в этой статье написаны на C#, но вы можете писатьприложения Windows Forms на любом языке, для которого есть компилятор .NET.Сегодня это: C#, Visual Basic, JScript и C++.
ЛИСТИНГ 1
using System;
using System.WinForms;
using System.Drawing;
public class MyForm: Form
{
public MyForm ()
{
Text = «Windows Forms Demo»;
}
protected override void OnPaint (PaintEventArgs e)
{
e.Graphics.DrawString («Hello, world», Font,
new SolidBrush (Color.Black), ClientRectangle);
}
public static void Main (string[] args)
{
Application.Run (new MyForm ());
}
}
Начнемсначала. Слово «using» вверхуфайла позволяют сослаться на классы в пакетах System,System.WinForms и System.Drawing. Например,
using System.WinForms;
выпишите
public class MyForm: System.WinForms.Form
вместо
public class MyForm: Form
Вприложении, использующем WindowsForms, каждое окно — или форма- представлено экземпляром класса, производного от System.WinForms.Form (Листинг 1 — класс MyForm). Конструктор MyForm устанавливает текст заголовкаформы «Windows Forms Demo» используя свойство Text. Text — одно изболее чем 100 свойств, которые форма наследует от System.WinForms.Form, но покаединственное, в котором вы нуждаетесь.
Каквы знаете, окна получают сообщения WM_PAINT и большинство перерисовок экрана выполненов ответ на эти сообщения. В Windows Forms эквивалент сообщения WM_PAINT — виртуальный метод по имени OnPaint. Производный класс формы можетпереопределить этот метод в случае надобности выполнять собственную перерисовкув ответ на сообщения WM_PAINT.
Обратитевнимание на ключевое слово в Листинге 1, которое компилятор C# интерпретируеткак подтверждение, что вы хотите переопределить виртуальный метод,унаследованный от базового класса. Перопределенный OnPaint записывает«Hello, world» в клиентской области формы. OnPaint вызывает объектPaintEventArgs (System.WinForms.PaintEventArgs), который содержит свойстваGraphics и ClipRectangle. Свойство Graphics ссылается к объекту Graphics(System.Drawing.Graphics), который является эквивалентом контекста устройства(device context) в Windows Forms. ClipRectangle производное объекта Rectangle(System.Drawing.Rectangle), который описывает какая часть формы являетсянедопустимой.
МетодOnPaint из MyForm использует Graphics.DrawString, чтобы выполнить вывод на экран.Первый параметр DrawString — непосредственно само сообщение (строка)«Hello, world». Второй — объект Font (System.Drawing.Font), которыйописывает шрифт для вывода текста. MyForm.OnPaint использует шрифт формы(которой установлен в свойстве Font формы). Третий параметр — Brush(System.Drawing.Brush) — объектное определение цвета текста. Четвертый изаключительный параметр — прямоугольник области, куда требуется вписать текст.
Заключительнаячасть MyForm — статический метод Main. Main — точка входа в приложение. Каждоеприложение .NET должно иметь этот метод. Main может быть объявлен любым изследующих способов:
public static void Main ()
public static int Main ()
public static void Main (string[] args)
public static int Main (string[] args)
Параметрargs метода Main — строковый массив параметров командной строки (задаваемых привызове программы). Элемент args[0] хранит первый параметр командной строки,args[1] — второй и т.д. Как правило, в каждом приложении метод Main выполняетсятолько однажды (компилятор Microsoft C# допускает использование ключа /main,указывающего в каком классе содержится метод Main, если приложение имеетнесколько классов с методами Main). Main может находиться в любом классе,определенном в приложении.
Отображениенашей формы на экране — простой пример выполнения MyForm и передачи действияApplication.Run. Application — другой класс, определенный в System.WinForms.Метод Run создает форму, отображает ее на экране и обрабатывает сообщения кней. Следующая инструкция в Листинге 1
Application.Run(new MyForm ());
обрабатываетMyForm и показывает форму.
Сохранитетекст программного кода (Листинг 1) в файле Hello.cs и откомпилируйте его.Чтобы это сделать, откройте окно командной строки, перейдите в каталог файлаHello.cs и введите:
csc /target:winexe /out:Hello.exe /reference:System.dll
/reference:System.WinForms.dll /reference:System.Drawing.dll
/reference:Microsoft.Win32.Interop.dll Hello.cs
Командаcsc вызывает компилятор Microsoft C#. «Hello.cs» указывает на файл,который требуется откомпилировать. Ключ "/target:winexe" сообщаеткомпилятору, что нужно создать GUI-приложение для Windows, а"/out:Hello.exe" задает имя файла программы (этот ключ можноопустить, т.к. в данном случае по умолчанию все равно будет создан Hello.exe, т.к.CS-файл назван Hello.cs). Ключи "/reference" указывают ссылки навнешние классы, например, для System.WinForms.Form и System.Drawing.Size. Длякраткости допускается заменять "/target" и "/reference" на"/t" и "/r".
Hello.exeне обычный EXE-файл, это .NET-программа, содержащая следующие важные элементы:
Microsoft Intermediate Language (MSIL), сгенерированный при помощи C#
Метаданные,описывающие типы (классы), определенные в приложении, и типы (например,System.WinForms.Form), на которые ссылается приложение, находящиеся в другомместе (например, в MsCorLib.dll и System.WinForms.dll)
Декларация,описывающая требуемые файлы для сборки приложения
Вязыке .NET, сборка — это коллекция из одного или более файлов, создающихмодуль. Наша сборка содержит только один файл — Hello.exe — и этот факт отмеченв декларации внутри выполнимой программы. Декларация физически сохранена какчасть метаданных. Каждая управляемая выполнимая программа — это есть любойPE-файл, который содержит MSIL — часть сборки и каждая управляемая выполнимаяпрограмма имеет метаданные внутри. Один из файлов в .NET-сборке содержитдекларацию идентификации файлов, которые должны быть включены при сборке иобщедоступные типы. Компилятор C# производит всю необходимую инфраструктуру.
Теперькогда вы откомпилировали Hello.exe, можете набрать в командной строке:
Hello
Посмотритена рис.1, чтобы увидеть результат работы нашей программы.
Список литературы
Дляподготовки данной работы были использованы материалы с сайта bestcode.org/
Windows Forms: Современная модель программирования для создания GUI приложений
244
0
8 минут
Понравилась работу? Лайкни ее и оставь свой комментарий!
Для автора это очень важно, это стимулирует его на новое творчество!