Снова о простой программе
Снова о простой программе
 В главе 1 был приведен довольно сложный код Windows-приложения, автоматически сгенерированный IDE. Приложение выполняло простейшую функцию — оно реагировало на нажатие кнопки. Тогда же мы пообещали, что вскоре вы поймете, как работает эта программа. Настало время вернуться к старому примеру (последовательность действий при построении этого приложения описана в главе 1). Прежде всего обратите внимание на то, что при построении приложений на базе форм Windows VS .NET IDE автоматически включает в решение ссылки на сборки System.Drawing и System.Windows.Forms; в этом нетрудно убедиться при помощи Object Browser (рис. 8.8). Сборка System.Drawing состоит из одного пространства имен, классы которого предназначены для изменения размеров и позиционирования форм и элементов. Кроме того, эта сборка используется при выводе или размещении на форме графических изображений. Сборка System.Windows.Forms тоже состоит из одного пространства имен и содержит классы всех элементов управления, а также класс Wi ndows. Forms. Form, представляющий экземпляры форм.

 Рис. 8.8. Простейшее Windows-приложение в программе Object Browser 
 1 Public Class Forml
 2 Inherits System.Windows.Forms.Form
 3
 4 IRegion "Windows Form designer generated code "
 5
 6 Public Sub New()
 7 MyBase.New()
 8
 9 ' Вызов необходим для работы дизайнера форм Windows
 10 InitializeComponent()
 11
 12 ' Дальнейшая инициализация выполняется
 13 ' после вызова InitializeComponent()
 14 End Sub
 15
 16 ' Форма переопределяет Dispose для очистки списка компонентов.
 17 Protected Overloads Overrides Sub Dispose(ByVal disposing As Boolean)
 18 If disposing Then
 19 If Not (components Is Nothing)Then
 20 components.Dispose()
 21 End If
 22 End If
 23 MyBase.Dispose(disposing)
 24 End Sub
 25 Friend WithEvents Buttonl As System.Windows.Forms.Button
 26
 27 ' Необходимо для работы дизайнера форм Windows
 28 Private components As System.ComponentModel.Container
 29
 30 ' ВНИМАНИЕ:  следующий фрагмент необходим для дизайнера форм Windows
 31 ' Для его модификации следует использовать дизайнер форм.
 32 ' Не изменяйте его в редакторе!
 33 <System.Diagnostics.DebuggerStepThrough()Private Sub 
InitializeComponent()
 34 Me.Buttonl = New System.Windows.Forms.Button()
 35 Me.SuspendLayout()
 36.
 37 'Button1
 38
 39 Me.Buttonl.Anchor = ((System.Wi ndows.Forms.AnchorStyles.Bottom Or _ 
System.Windows.Forms.AnchorStyles.Left) Or _ 
System.Windows.Forms.AnchorStyles.Right)
 40 Me.Buttonl.Location = New System.Drawing.Point(46.216)
 41 Me.Buttonl.Name = "Buttonl"
 42 Me.Buttonl.Size = New System.Drawing.Size(200.48)
 43 Me.Buttonl.Tablndex = 0
 44 Me.Buttonl.Text = "Click me!"
 45'
 46 'Form1
 47'
 48 Me.AutoScaleBaseSize = New System.Drawing.Size(6,15)
 49 Me.ClientSize = New System.Drawing.Size(292,268)
 50 Me.Controls.AddRangetNew
 System.Wi ndows.Forms.Control(){Me.Buttonl})
 51 Me.Name ="Form1"
 52 Me.Text = "First Windows Application"
 53 Me.ResumeLayouUFalse)
 54
 55 End Sub
 56
 57 #End Region 
 58
 59 Private Sub Buttonl_Click(ByVal sender As System.Object.ByVal e As _ 
System.EventArgs)Handles 
Buttonl.Click
 60 MsgBox("Thanks for clicking!")
 61 End Sub
 62 End Class
 Из строк 1 и 2 видно, что перед нами открытый (Public) класс, производный от класса Form пространства Имен System.Windows. Forms. Знак # в строке 4 отмечает на- чалорегиона в автоматически сгенерированном коде. Помните, что при любых операциях в окне свойств или перетаскивании элементов в дизайнере генерируется программный код. По мере накопления опыта вы научитесь просматривать этот код и редактировать его.
 В строках 6 и 7 начинается конструктор класса. Как обычно, в начале конструктора производного класса вызывается конструктор базового класса (за дополнительной информацией по этой теме обращайтесь к разделу «Иерархия классов пространства имен System.Windows.Forms» этой главы).
  В строке 10 вызывается метод Initial izeComponent, определяемый в строках 33-35. Этот метод генерируется автоматически и преобразует в программный код все ваши действия на стадии конструирования и в окне свойств. Например, кнопка объявляется в строке 25; позже ее экземпляр создается в строке 34, а размещение кнопки на форме происходит в строке 50. Также обратите внимание на то, как в строках 44 и 52 программа задает свойство Text кнопки и формы в соответствии с данными, введенными в окне свойств.
 
В строках 40 и 42 методы пространства имен System. Drawl ng задают позицию и размеры кнопки, а в строках 48-49 аналогичные действия выполняются для формы. По умолчанию единицей измерения в графических операциях являются пикселы (!), а не твипы (twips).
В строках 17-24 реализуется версия метода Dispose, необходимого для приложений на базе форм Windows. Формат этого метода несколько отличается от простого метода Dispose, описанного в главе 5; в данном примере освобождаются все ресурсы, используемые всеми элементами формы, а также самой формой.
В строке 25 используется уже знакомый синтаксис (см. главу 6), указывающий на то, что кнопка является источником событий. Непосредственное подключение обработчика происходит в строках 59-61 с ключевым словом Handles. Синтаксис всех автоматически сгенерированных событий элементов и форм в .NET аналогичен приведенному в строке 59:
Sub ObjectName_eventname(ByVal sender As Object.Byval e As EventArgs)_
Handles ObjectName.eventname
В параметре sender передается ссылка на элемент, инициировавший событие. В параметре EventArgs инкапсулируется описание события (при таких событиях, как KeyPress или MouseDown, используются объекты классов, производных от EventArgs, — такие, как KeyEventArgs и MouseEventArgs; в них передается дополнительная информация).
Приложение на базе форм Windows можно запустить из процедуры Sub Main, являющейся точкой входа вашего приложениях. При этом вызывается метод Application.Run, которому передается имя формы:
Pubic Sub Main()
Dim myForm As New Forml()
Application.Run(myForm)
End Sub
(Замаскированный вызов Application.Run присутствует везде, где форма используется в качестве стартового объекта. Интересная подробность: этот вызов обязателен в С#, но не в VB .NET.)
