
Теперь пришло время создать наше первое оконное приложение.
Разрабатываемое приложение будет представлять собой небольшую форму, повторяющую идею давным-давно придуманной программы: на форме будет содержаться вопрос «Вы стремитесь сделать мир лучше?». При попытке наведения указателя мыши на кнопку «Да, конечно!» окно будет убегать от нас. Нажатие на кнопку «Нет» не будет ничем ограничено.
Создвая данную программу, мы рассмотрим основые принципы создания оконных приложений в C#, а так же методы реализации с помощью них каких-либо конечных целей - в нашем случае - это забавно убегающее окно.
Создайте новый проект, в качестве типа шаблона установите приложение Windows Forms, как показано на рисунке 1:

Рисунок 1.
Назовите проект RandWindow и нажмите кнопку ОК.
Рабочее окно MS Visual Studio содержит следующие вспомогательные окна (рисунок 2)

Рисунок 2.
На рисунке цифрма отмечены:
Создание оконных приложений сводиться к созданию всех необходимых диалоговых окон, а так же к размещению на них необходимых элементов. В дальнейшем мы настраиваем обработку событий, создаваемых пользователем и настраиваем технические аспекты работы программы. В нашем случае - мы сначала разместим все необходимые элементы управления на главной форме, после чего добавим обработчик события перемещения мыши и обработку нажатия кнопок.
Итак, после того как вы ввели имя проекта, установили необходимый шаблон и нажали кнопку ОК, MS Visual Studio автоматически создаст каркас оконного приложения, после чего мы сможем добавить на него новые оконные элементы.
Для этого необходимо перетащить необходимый оконный элемент из окна инструментов (ToolBox).
Нашему окну потребуется 2 элемента поля для ввода, в которые мы будем выводить координаты указателя мыши, что облечит нам понимание работы программы.
В центре окна будет находиться надпись, которую мы создадим с помощью элемента Label.
Снизу будут расположены 2 кнопки.
Немного растените заготовку окна. Если вы нажмете на него правой кнопкой, то откроется контекстное меню. В нем нажмите на пункте свойства, после чего вы сможите изучить различные параметры окна, которые вы помите изменить. На рисунке 3 изображены самые (как правило) необходимые свойства:

Рисунок 3.
Немного растяните заготовку окна и добавьте все необходимые элементы. На рисунке 4 вы можите увидеть их в окне ToolBox:

Рисунок 4.
Перейдите в свойства строки Label1, где измените текст на «Вы стремитесь сделать мир лучше?».
Так же измените тип шрифта, для этого найдите свойство Font (рисунок 5),

Рисунок 5.
после чего установите тип шрифта Tahoma, ширину шрифта Bold и размер равный 16 (рисунок 6).

Рисунок 6.
Далее измените текст на кнопках , используя свойство Text.
Полученная заготовка окна программы будет выглядеть следующим образом (рисунок 7)

Рисунок 7.
Теперь рассмотрим техническую часть работы нашей программы.
Щелкните непосредственно на части формы создаваемого приложения (НЕ на одном из элементов).
Теперь перейдите к свойствам формы, с помощью правого щелчка мышью -> контекстное меню свойства.
Теперь необходимо перейти к списку возможных событий, которые может получать данное окно – для этого щелкните на кнопке «Event» (события) , как показано на рисунке 8:

Рисунок 8.
Когда пользователь передвигает указатель мыши по нашему окну, операционная система посылает сообщение программе, с текущими координатами указателя. Они то нам и нужны.
Чтобы назначить обработчик данного события найдите строку MouseMove (рисунок 9), после чего сделайте двойной щелчок в поле справа от нее – автоматически добавиться обработчик события движения мыши и добавиться функция Form1_MouseMove в коде нашей программы.

Рисунок 9.
Добавтьте в эту функцию 2 строки, чтобы ее код стал выглядеть следующим образом.
// ппереводим координату X в строку и записывает в поля ввода}
textBox1.Text = e.X.ToString();
// переводим координату Y в строку и записывает в поля ввода
textBox2.Text = e.Y.ToString();
Данная функция, обрабатывающая событие перемещения указателя мыши над формой получает 2 параметра – объект отправитель и экземпляр класса MouseEventsArgs , содержащий информацию о координатах указателя мыши и других текущих свойствах.
textBox1 и textBox2 это экземпляры класса textbox, реализующие управление нашими элементами поля для ввода.
Член данных экземпляров Text позволяет установить текст в данных полях.
Таким образом, если теперь откомпилировать программу (F5) – при перемещении указателя мыши по форме окна мы будем видеть координаты указателя (внутри формы), которые будут непрерывно изменяться .
Теперь вернемся к заготовке нашей формы – для это щелкните на соответствующей закладке (Form1.cs [Конструктор]), как показано на рисунке 10:
![]()
Рисунок 10.
Сделайте двойной щелчок по первой кнопке – Visual Studio автоматически добавит код обработки данной кнопки при нажатии.
Добавьте следующие строки кода:
// Вывести сообщение с текстом "Вы усердны"}
MessageBox.Show( "Вы усердны!!");
// Завершить приложение
Application.Exit();
Теперь снова вернитесь к конструктору и добавьте вторую кнопку , так же с помощью двойного щелчка по ней.
Она будет содердать следующий код
// Вывести сообщение, с текстом "Мы не сомневались в вешем безразличии"}
// второй параметр - заголовок окна сообщения "Внимание"
// MessageBoxButtons.OK - тип размещаемой кнопки на форме сообщения
// MessageBoxIcon.Information - тип сообщения - будет иметь иконку "информация" и соотвествующее звукововой сигнал
MessageBox.Show("Мы не сомневались в вешем безразличии","Внимание", MessageBoxButtons.OK, MessageBoxIcon.Information);
Как видите, здесь мы немного усложнили код вызова окна-сообщения, чтобы продемнстрировать то, как оно работает более подробно. Все параметры передаваемые в фукнцию Show закоментированы в исходном коде.
Теперь нам осталось только реализовать перемещение окна в тот момент, когда мышь придлижается к кнопке «Да, конечно».
Для этого мы добавим код в функцию
private void Form1_MouseMove(object sender, MouseEventArgs e)
Принцип очень прост - получая координаты движения мыши, мы проверяем не входят ли они в квардрат, очерчивающий нашу кнопку с небольшим запасом. Если да - то мы генерируем 2 случайных числа, которые будут использованы для перемещения окна.
Мы бы могли просто отслеживать сообщение о наведении указателя мыши на кнопку, но оно приходит с заметной задержкой, в связи с чем пользователь без особого труда нажмет на кнопку да, поэтому мы будем просто вычислять попадание курсора в зону вокруг кнопки.
Так же, нам понадобиться объявить несколько "рабочих" переменных, которые мы будем в дальнейшем использовать.
Класса Random в C#, представляет собой генератор псевдослучайных чисел - т.е. данный класс, отвечает за выдачу последовательности чисел, отвечающую определенным статистическим критериям случайности.
Здесь мы объявили экземпляр класса Random (rnd), с помощью которого мы булем генерировать случайные числа. В дальнейшем мы будем использовать код, вида rnd.Next(диапазон_генерации); или rnd.Next(от,до); для генерации случайного числа.
Так же мы объвим еще несколько переменных, часть из которых сразу будет инициализированна.
tmp_location объявляется для того, что бы в будущем временно хранить текущее положение окна.
Так же нам следует подумать о том, что при случайном перемещении, наше окно может выйти далеко за пределы экрана.
System.Windows.Forms.SystemInformation.PrimaryMonitorSize
_h и _w будут хранить в себе размеры экрана пользователя, которое определяется при их инициализации.
Теперь код этой функции будет выглядеть следующим образом:
}// ппереводим координату X в строку и записывает в поля ввода
textBox1.Text = e.X.ToString();
// переводим координату Y в строку и записывает в поля ввода
textBox2.Text = e.Y.ToString();// если координата по оси X и по оси Y лежит в очерчиваемом вокруг кнопки "да, конечно" квадрате
if (e.X > 80 && e.X < 195 && e.Y > 100 && e.Y < 135)
{// запоминаем текущее положение окна}
tmp_location = this.Location;
// генерируем перемещения по осям X и Y и прибовляем их к хранимому значению текущего положения окна
// числа генерируются в диапазоне от -100 до 100.
tmp_location.X += rnd.Next(-100, 100);
tmp_location.Y += rnd.Next(-100, 100);
// если окно вылезло за пределы экрана по одной из осей
if (tmp_location.X < 0 || tmp_location.X > (_w - this.Width / 2) || tmp_location.Y < 0 || tmp_location.Y > (_h - this.Height / 2))
{// новыми координатами станет центр окна}
tmp_location.X = _w / 2;
tmp_location.Y = _h / 2;
// обновляем положение окна, на новое сгенерированное
this.Location = tmp_location;
Вот собственно и все. Откомпеллировав приложение - можете попробовать нажать на кнопку "Да, конечно". Это будет крайне трудно :).
Исходный код данного урока (для VS 2008).
Обсуждение данного урока: Создание первого оконного приложения в C# .NET
Далее. 2.3 Создание второго оконного приложения в C#.