В предыдущей части пошарпанного практикума мы начали изучать язык C#, по ходу тренируясь писать программы на примерах консольных приложений (CUI-приложений). Этот вид приложений, бесспорно, имеет право на существование. Но на дворе XXI век, а значит более востребованы программы, имеющие графический интерфейс, — так называемые GUI-приложения. Написанием данного типа программ мы сейчас и займемся. Исходные тексты примеров программ можно загрузить с сайта «Моего Компьютера»: http://www.mycomp.com.ua/csharp2.zip. Продолжение, начало см. в МК № 29 (252).

В качестве лирического вступления у нас будет маленький агитпроп. В принципе, все популярные языки программирования (C++, Visual Basic) давно обзавелись своими .NET-аналогами (C#, Managed Extensions for C++, VB.NET). Все, кроме Borland Delphi Language. До недавнего времени среда разработки Delphi не содержала средств, позволяющих писать полноценные .NET-программы (не совсем удачная попытка .NET Preview for Delphi 7 не в счет). Такая ситуация с языками держалась на протяжении последних двух лет. И вот недавно, с большим опозданием от других языков, была анонсирована среда Delphi 8, предназначенная именно для разработки .NET-приложений. Иначе говоря, все популярные языки программирования уже развиваются в сторону .NET-технологий, и все программисты медленно, но уверенно переползают на платформу .NET. Излишне «консервативным» же программистам в ближайшем будущем, вероятно, придется «пасти задних».

Вкратце напомню, что для написания .NET-программ на языке C# сгодится любой текстовый редактор. А для компиляции и выполнения программ необходима установленная на компьютере среда .NET Framework, которую можно бесплатно загрузить с сайта Microsoft по адресу (более детально описано в [3]). Конечно, идеальный вариант — установить на компьютере среду разработки Visual Studio .NET. При этом вы сразу получаете мощнейший редактор, .NET Framework и компилятор в одном флаконе. Если все необходимое уже имеется под рукой, то приступим к написанию банального GUI-приложения.

Давно известно, что первым словом ребенка является «мама», а первым «словом» программиста — «Hello, world!» Поэтому писать будем программу, выводящую банальное окно с надписью «Hello, world!».

Язык C# является полностью объектно-ориентированным, поэтому C#-программа состоит из описаний классов и объектов. Классы, в свою очередь, содержат члены: поля, свойства, методы, события и проч. Ниже приведен код GUI-программы, создающей пустую форму.

using System.Windows.Forms; public class App { public static void Main() { Application.Run(new Form()); } }

Как уже говорилось ранее, код можно набирать в любом текстовом редакторе. Сохраните набранный код в файле Form1.cs. (файлам с исходным кодом на C# принято давать расширения .cs). Для компиляции программы наберите в командной строке:

csc.exe /t:winexe Form1.cs

Если ошибок при наборе кода не было, то компиляция должна пройти успешно, после чего появится файл Form1.exe. Этот файл — ваша первая .NET-программа с графическим интерфейсом. Смело запускайте, и вы увидите, что программа Form1.exe при запуске создает окно небольшого размера (Рис. 1).

Рис. 1.

Теперь пояснения к набранному коду. Любая .NET-программа базируется на FCL-классах (Framework Class Library). Для удобства и для предотвращения конфликта имен классов все FCL-классы были сгруппированы в пространства имен (namespace). В первой строчке объявляется, что в программе будут использоваться типы из пространства имен System.Windows.Forms. Это пространство имен содержит классы, предназначенные именно для написания GUI-программ.

Далее в коде идет описание класса App с одним статическим методом Main(). Этот метод является точкой входа в программу; именно с него начинается выполнение кода. В этом методе создается экземпляр класса Form, который сразу передается в качестве аргумента статическому методу Run класса Application. Класс Form — это заготовка формы, которую вы видели при запуске программы Form1.exe. При создании объекта — экземпляра класса Form, все свойства объекта принимают значения по умолчанию, что соответствует квадратной форме небольшого размера.

Как видите, в созданной программе надписи «Hello, world!» не наблюдается. Да и функциональностью, честно говоря, ваша первая программа не блещет. Будем развивать программистскую мысль и дорабатывать ваше детище. Создайте файл Form2.cs и наберите в нем следующий код:

using System.Windows.Forms; public class Form2: Form { public Form2() { this.Text = "Еженедельник 'Мой Компьютер'"; this.StartPosition = FormStartPosition.CenterScreen; this.Height = 200; this.Width = 400; } } public class App { public static void Main() { Application.Run(new Form2()); } }

Скомпилируйте из командной строки:

csc.exe /t:winexe Form2.cs

Запусти[ударение!!]те Form2.exe, и увидите примерно то, что изображено на Рис. 2.

Рис. 2.

Выводимая форма немного преобразилась. Посмотрим на набранный код Form2.cs. В нем осталось все от прежней программы Form1.cs, плюс добавилось описание нового класса формы Form2. Наш класс формы Form2 наследуется от стандартного класса Form. Класс Form2 имеет всего один метод с названием Form2(). Этот метод является конструктором класса и вызывается при создании объекта. В этом конструкторе устанавливаются некоторые свойства формы (заголовок, положение, высота, ширина) в нужные нам значения. Далее описан класс App, имеющий точку входа в программу — метод Main(). В этом методе уже создается не объект стандартного класса Form, а объект нового, описанного нами, класса Form2.

Как и прежде, в созданной нами программе нет надписи «Hello, world!» Думаю, самое время ее добавить. Снова создайте файл Form3.cs и наберите в нем код, приведенный ниже:

using System.Drawing; using System.Windows.Forms; public class Form2: Form { private Label labelHello; public Form2() { this.Text = "Еженедельник 'Мой Компьютер'"; this.StartPosition = FormStartPosition.CenterScreen; this.Height = 200; this.Width = 400; this.labelHello = new Label(); this.labelHello.Left = 50; this.labelHello.Top = 50; this.labelHello.Text = "Hello, world!"; this.labelHello.Font = new Font(labelHello.Font.FontFamily, 36); this.labelHello.AutoSize = true; this.Controls.Add(labelHello); } } public class App { public static void Main() { Application.Run(new Form2()); } }

Скомпилировав и запустив программу Form3.exe, вы увидите следующее окно (см. Рис. 3).

Рис. 3.

Да! Вы только что написали классический пример «Hello, world!», с которого начинается изучение любого языка программирования. Теперь немного пояснений по коду Form3.cs. Как видите, добавилось еще несколько новых строчек.

Для демонстрации текста на форме используется специальный класс —Label (метка). В строке private Label labelHello; объявляется переменная labelHello, имеющая тип Label. Далее, в конструкторе формы Form2() задаются некоторые свойства формы. После этого создается объект-метка labelHello и устанавливаются ее свойства, в частности координаты положения, текст и размер шрифта.

Для задания размера шрифта метки используется тип Font, который описан в пространстве имен System.Drawing. Обратите внимание на первую строку кода, в которой указывается, что в программе используются типы из пространства имен System.Drawing, в частности тип Font.

В конце метода-конструктора формы созданный объект-метка добавляются на форму:

this.Controls.Add(labelHello);

Теперь пофантазируем о добавлении какой-либо функциональности в вашу программу, например кнопки, при нажатии на которую текст «Hello, world!» будет меняться на «Bye-bye, world!» Создайте в текстовом редакторе очередной файл, назовите его Form4 и наберите нижеприведенный код:

using System; using System.Drawing; using System.Windows.Forms; public class Form2: Form { private Label labelHello; private Button button; public Form2() { this.Text = "Еженедельник 'Мой Компьютер'"; this.StartPosition = FormStartPosition.CenterScreen; this.Height = 200; this.Width = 400; this.labelHello = new Label(); this.labelHello.Left = 50; this.labelHello.Top = 50; this.labelHello.Text = "Hello, world!"; this.labelHello.Font = new Font(labelHello.Font.FontFamily, 36); this.labelHello.AutoSize = true; this.button = new Button(); this.button.Left = 20; this.button.Top = 120; this.button.Text = "Click me"; this.button.Click += new EventHandler(button_Click); this.Controls.Add(labelHello); this.Controls.Add(button); } private void button_Click(object sender, System.EventArgs e) { this.labelHello.Text = "Bye-bye, world!"; } } public class App { public static void Main() { Application.Run(new Form2()); } }

Как видите, в коде появилась новая переменная, имеющая тип Button. Это кнопка. Как и в случае с меткой (labelHello), параметры кнопки устанавливаются в конструкторе формы Form2(). Задается расположение кнопки на форме, ее текст, а также задается обработчик события нажатия на кнопку.

Обработка событий в C# основывается на так называемых делегатах (delegate). Делегат — это тип, определяющий прототип метода (количество параметров и их типы), который будет вызван при срабатывании события. В примере Form4.cs метод button_Click формы Form2 имеет прототип, четко определенный делегатом EventHandler. В строке исходного кода this.button.Click += new EventHandler(button_Click); происходит регистрация метода button_Click() в качестве обработчика события нажатия кнопки button. В реализации метода button_Click() строка this.labelHello.Text = "Bye-bye, world!"; меняет текст в окне на «Bye-bye, world!»

Если скомпилировать и запустить программу, появится окно (Рис. 3). При нажатии на кнопку надпись в окне изменяется на «Bye-bye, world!» (Рис. 4).

Рис. 4.

В описанных выше программах были применены всего несколько FCL-типов из пространства имен Windows.Forms (Form, Label, Button). Рассказать про все или даже про основные FCL-типы не представляется возможным, да и смысла в этом нет, так как запомнить все типы, содержащиеся в FCL, просто невозможно — их десятки тысяч. Лучший выход из положения — справочная система под рукой. Я имею ввиду MSDN, в которой можно найти практически всю информацию о .NET Framework. MSDN на данный момент занимает три компакт диска и продается там же, где и Visual Studio .NET.

Все рассмотренные сегодня программы были написаны самым простым способом: с применением текстового редактора и компилятора командной строки. По эффективности это примерно то же, что палкой-копалкой рыть канаву. Для ускорения процесса разработки программ давно применяются так называемые среды разработки. Самым известным представителем такого рода программ является Visual Studio .NET. В этой среде разработки имеется специальный визуальный редактор, в котором несколькими движениями мыши настраиваются свойства любого компонента. К примеру, в исходном коде программы Form4.cs есть строки, в которых устанавливаются различные свойства объекта типа Label. В визуальном редакторе Visual Studio .NET можно просто схватить мышкой объект-метку и переместить на нужную позицию (Рис. 5), а среда разработки за вас вставит в исходный код программы строки вида:

this.labelHello.Left = …; this.labelHello.Top = …;

Рис. 5.

С такой же легкостью настраивается текст объекта-метки и другие ее свойства. Все эти красивости и удобства, бесспорно, ускоряют процесс написания программ, но не способствуют пониманию, как и что в написанной программе работает. Как вы понимаете, знания, равно как и умение писать C#-программы в простом текстовом редакторе, никогда лишними не будут.

Литература:

1. Том Арчер. Основы C#: пер. с англ. — М.: Microsoft Press, 2001. — 448с.

2. Джеффри Рихтер. Программирование на платформе .NET Framework: пер. с агнл. — М.: Microsoft Press, 2002. — 488с.

3. Игорь Павлов. Что .NET грядущий нам готовит? «Мой компьютер» №10 (233)

4. Игорь Павлов. Пошарпанный практикум «Мой компьютер» №29 (252)