C#, Windows Forms: программа с графическим интерфейсом
ilyachalov — 19.05.2025
Я когда-то давно (действительно давно) писал программы с
графическим интерфейсом для системы Windows. Использовал для этого
среду Visual Studio. Тогда она только появилась. Намедни пришлось
освежать этот опыт. В этот раз использовал «Visual Studio Community
2022» (версия 17.14.0, 64-разрядная) с установленной рабочей
нагрузкой «Разработка классических приложений .NET». Операционная
система — Windows 10.В среде «Visual Studio Community 2022» у меня включен интерфейс на русском языке, поскольку на компьютерах в аудитории настроено так.
С технологиями и аббревиатурами, как обычно, куча путаницы. Как я понял, на данный момент платформа «.NET Framework» остановлена в развитии (последняя версия — 4.8.1). Ее не рекомендуют использовать для новых проектов. Ее продолжением является платформа «.NET» (изначально она называлась «.NET Core»). Получается, что сейчас имеет смысл создавать проекты на платформе «.NET». Актуальных версий платформы «.NET» две — «.NET 8» (с долговременной поддержкой, LTS) и «.NET 9» (с экспериментальными нововведениями). По умолчанию сейчас имеет смысл использовать «.NET 8».
На курсе, который я сейчас преподаю, для написания программ используется язык C#. Часть пособий устарела, поэтому постоянно заглядываю в интернет. Кроме нововведений в языке C# есть путаница с библиотеками «Windows Forms» и «Windows Presentation Foundation» (WPF). Как я понял, библиотека WPF была создана на замену библиотеке Windows Forms. Между этими библиотеками есть ряд важных отличий, я их в этой статье не буду перечислять. На данный момент обе эти библиотеки доступны. Библиотека «Windows Forms» живее всех живых, об этом можно судить по аккуратно поддерживаемой документации на сайте компании Microsoft (когда эта компания действительно станет отказываться от Windows Forms, это сразу скажется на качестве поддержки документации, проверено).
Создание проекта, выбор шаблона
Для создания нового проекта в среде Visual Studio многие используют «начальное окно», но я его обычно отключаю. Поэтому для создания нового проекта я использую главное меню, пункт «Файл – Создать – Проект...» (или Ctrl+Shift+N). В открывшемся окне нужно выбрать шаблон проекта. У меня установлено две рабочие нагрузки, поэтому список шаблонов довольно большой. Для поиска нужного шаблона использую фильтры над списком шаблонов, там их три: по языку программирования (C#), по платформе (Windows) и по типу проекта (рабочий стол). После выбора этих фильтров нужные шаблоны окажутся близко к верхней части списка шаблонов, их можно будет легко найти.
Там есть два шаблона с похожими названиями: «Приложение Windows Forms (Майкрософт)» и «Приложение Windows Forms (.NET Framework)». Выбираю первый вариант (он — для платформы «.NET»), поскольку (я уже об этом писал выше) платформа «.NET Framework» остановлена в развитии, и ее не рекомендуют использовать для новых проектов.
После нажатия кнопки «Далее», в следующем окне, настраиваю проект: название, месторасположение, устанавливаю галку «Поместить решение и проект в одном каталоге» (практически все учебные программы являются решениями из одного проекта, поэтому нет смысла усложнять иерархию папок).
После нажатия кнопки «Далее», в следующем окне, произвожу выбор платформы. Как я уже писал выше, есть два варианта: «.NET 8» и «.NET 9». Выбираю вариант по умолчанию — «.NET 8» (с долгосрочной поддержкой, LTS).
После нажатия кнопки «Создать» среда создает папку и файлы проекта. В зависимости от характеристик вашего компьютера и текущей нагрузки на него, возможно, придется подождать (на моем компьютере это обычно занимает секунд 15-25).
Состав файлов проекта, конструктор форм
Если заглянуть в папку проекта (для этого я использую программу «Проводник Windows» или просто «Проводник»), то можно увидеть там кучу разных файлов. На данном этапе меня интересуют только файлы с исходным кодом, то есть текстовые файлы с расширением «.cs». Всего их там три, вот список (с указанием определенных в них классов):
– Form1.cs (класс Form1);
– Form1.Designer.cs (класс Form1);
– Program.cs (класс Program с методом Main, это точка входа в программу).
Эти же файлы можно увидеть из среды Visual Studio из «Обозревателя решений». Чтобы увидеть в «Обозревателе решений» файл «Form1.Designer.cs», нужно открыть ветку файла «Form1.cs». Для просмотра исходного кода можно дважды щелкнуть мышью по имени соответствующего файла в «Обозревателе решений».
У файла «Form1.cs» есть особенность: при попытке его открыть на просмотр по умолчанию открывается вкладка «Form1.cs [Конструктор]» с конструктором форм, в котором видно, как окно будет выглядеть при запуске программы, но не видно исходного кода. Для просмотра исходного кода файла «Form1.cs» можно открыть контекстное меню щелчком правой кнопки мыши по форме в конструкторе форм и там выбрать пункт «Перейти к коду». После этого откроется дополнительная вкладка с названием «Form1.cs» и в ней можно будет просмотреть и отредактировать исходный код.
Можно заметить, что в файлах «Form1.cs» и «Form1.Designer.cs» описан один и тот же класс Form1. Для разделения одного и того же класса по разным файлам в языке C# используется служебное слово partial (частичный) в описании класса. То есть класс частично описан в одном файле и частично — в другом файле. При компиляции эти отдельные описания объединяются.
Сборка и запуск программы
Сразу после создания проекта по шаблону (было описано выше) можно выполнить сборку и запуск программы: главное меню, пункт «Отладка – Запуск без отладки» (или Ctrl+F5) или с помощью кнопки с панели инструментов. Сборку и запуск программы можно выполнять последовательно по отдельности, но для небольших учебных программ можно сразу выполнять запуск без отладки, при этом сборка будет выполнена автоматически, если в ней возникнет необходимость.
После запуска программы откроется окно программы. Оно обладает всем набором функций обычных окон в системе Windows: его можно перетаскивать, сворачивать/разворачивать, менять размер, закрыть и т.п. Но это не слишком интересно. Поэтому в первой программе мы решили поработать с событиями мыши: отслеживание движения указателя мыши, щелчка кнопкой мыши, получение и вывод экранных координат указателя мыши.
Привязка к событиям обработчиков событий
Конечно, всё можно писать вручную, но имеет смысл использовать автоматическую генерацию кода, которую выполняет среда Visual Studio. Это сильно ускорит написание программы, для этого интегрированная среда разработки и была придумана.
Конструктор форм (как уже было сказано выше) открывается открытием файла «Form1.cs» из «Обозревателя решений». Щелчком правой кнопки мыши по форме окна можно открыть контекстное меню, откуда выбираю пункт «Свойства» для открытия панели со свойствами формы.
Важно отметить, что панель «Свойства» имеет две вкладки: «Свойства» и «События». У меня по умолчанию включена вкладка «Свойства». Для работы с событиями нужно перейти на вкладку «События» (кнопка с рисунком молнии). Слева от кнопок вкладок есть еще две кнопки: «По категориям» и «В алфавитном порядке» — переключение между двумя режимами отображения списка свойств или списка событий на панели свойств формы. В разных случаях удобно использовать разные режимы отображения списка, выбирайте на свой вкус.
Для привязки обработчика событий к событию щелчка левой кнопки мыши по форме окна в списке событий формы выбираю событие с названием MouseClick и дважды щелкаю по нему левой кнопкой мыши. После этого откроется исходный код в файле Form1.cs и в класс Form1 автоматически добавится метод с названием Form1_MouseClick с пустым телом. В тело этого метода добавляю код обработки соответствующего события (я не буду его здесь публиковать, так как в рамках этой статьи для меня это неважно). У этого метода два параметра:
sender и
e
(сокращение от слова event). Параметр e содержит
информацию о произошедшем событии, в частности, из него можно
извлечь экранные координаты точки, по которой щелкнули мышью, а
также название кнопки мыши, которой щелкнули.Точно также я создал в качестве обработчика события движения указателя мыши над формой метод с названием Form1_MouseMove с пустым телом и добавил в его тело нужный исходный код (я не буду его здесь публиковать, так как в рамках этой статьи для меня это неважно).
Полученная программа отображает изменяющиеся координаты указателя мыши в заголовке главного окна, а также выводит маленькое окошко (MessageBox) при щелчке левой кнопкой мыши по окну программы (в окошке показаны экранные координаты щелчка):

Механизм привязки событий к обработчикам событий
Как сделаны эти привязки в исходном коде, можно посмотреть в файле «Form1.Designer.cs» проекта. Если вы пользуетесь автоматическим добавлением привязок (как было описано выше), а не пишете код сами, то не следует менять код в файле «Form1.Designer.cs» вручную. Но посмотреть на этот код, конечно, для студента необходимо.
По умолчанию интересный нам код свернут в серую строку «Windows Form Designer generated code». Эту строку можно развернуть стрелкой слева от исходного кода (функционал среды разработки). Становится видно, что автоматически сгенерированный код помещен в рамки директив
#region и
#endregion.Внутри сгенерированного кода после добавления двух обработчиков событий (описано выше) появился следующий код:
MouseClick += Form1_MouseClick; MouseMove += Form1_MouseMove;
Тут используется связка делегата MouseEventHandler и событий MouseClick и MouseMove (определены в классе Control, базовом для класса Form). Они обеспечивают механизм привязки. Сама привязка выполняется с помощью операции
+=.В интернете огромное количество статей и книг по понятиям «делегат» и «событие» в языке C#. К сожалению, какой-то конкретный источник посоветовать пока не могу, так как не нашел такого источника, где эти понятия объяснены понятным, человеческим языком (понятия несложные, но, вероятно, их сложно объяснить просто). Так что читайте всё подряд по теме, после десятка источников всё станет более-менее понятно.
|
|
</> |
Швеллер из нержавеющей стали: размеры по ГОСТ, марки AISI и цены в 2026 году 
