Зачем нужны windows forms

Что нового в Windows Forms runtime в .NET 5.0

С тех пор как Windows Forms был «Open Soursed» в конце 2018 года и в целом интерфейс был перенесен на .NET Core, и команда, и наши внешние участники были заняты исправлением старых ошибок и добавлением новых функций. В этом посте мы поговорим о новых возможностях среды выполнения Windows Forms в .NET 5.0. Заглядывайте под кат!

Улучшения и дополнения элементов управления Windows

Пожалуй, самое крутое в Windows Forms сегодня — это живое и заинтересованное сообщество на GitHub. Многие из новых функций и улучшений были либо предложены, либо даже полностью реализованы членами нашего сообщества. В рамках разработки .NET 5.0 мы приняли и смерджили более 900 запросов, причем более чем 70% этих запросов исходило от нашего сообщества. Огромный привет всем его участникам, которые помогли нам улучшить Windows Forms runtime.

Вот несколько примеров того, что мы получили от сообщества.

Новый элемент управления TaskDialog

Task dialog — это диалоговое окно, которое может использоваться для отображения информации и получения простого ввода от пользователя, но имеет больше функций, чем окно сообщения. Как и окно сообщения, оно форматируется операционной системой в соответствии с заданными вами параметрами.

Улучшения ListView

Элемент управления ListView хорошо знаком разработчикам Windows Forms, однако в нем отсутствовал API для легкого доступа к некоторым функциям, добавленным в Windows Vista, таким как сворачиваемые группы, групповые задачи, субтитры и нижние колонтитулы.

В .NET 5.0 мы преодолели разрыв API, и теперь Windows Forms ListView намного ближе к паритету с нативным элементом управления Win32.

Улучшения FileDialog

FileDialog получил новый API: FileDialog.ClientGuid. Диалоговое окно файла Windows позволяет вызывающему приложению связать идентификатор GUID с постоянным состоянием диалогового окна. Состояние диалогового окна может включать такие факторы, как последняя посещенная папка, а также положение и размер диалогового окна. Обычно это состояние сохраняется в зависимости от имени исполняемого файла. При указании GUID приложение может иметь разные сохраняемые состояния для разных версий диалогового окна в одном приложении (например, диалогового окна импорта и открытого диалогового окна).

Улучшения производительности

Windows Forms всегда была известна как управляемая оболочка для Win32 API. Таким образом, Windows Forms всегда сильно зависела от уровня взаимодействия с неуправляемыми компонентами Windows. Главным приоритетом с первых дней существования .NET Core была оптимизация нашего уровня взаимодействия, создание непреобразуемых структур, явный выбор более эффективных «W»-функций и использование «unsafe» кода там, где это возможно. Все эти изменения — это то, что мы называем «изменениями арахисового масла», в том смысле, что каждое из них является крошечным и вряд ли заметным, но за время жизни приложения эти изменения в сумме приводят к существенному увеличению производительности.

В .NET 5.0 мы подняли планку выше и оптимизировали несколько путей. Исторически Windows Forms полагалась на GDI+ (и некоторые GDI) для операций отрисовки. Хотя GDI+ проще в использовании, чем GDI, поскольку он абстрагирует контекст устройства (структуру с информацией о конкретном устройстве отображения, таком как монитор или принтер) через объект Graphics, он также работает медленно из-за дополнительных накладных расходов. В ряде ситуаций, когда мы имеем дело со сплошными цветами и кистями, мы решили использовать GDI.

Читайте также:  Linux сортировка вывода команды

Мы также расширили ряд API-интерфейсов, связанных с рендерингом (например, PaintEventArgs), с помощью интерфейса IDeviceContext, который, хотя и может быть недоступен напрямую разработчикам Windows Forms, позволяет нам обойти объект GDI+ Graphics и, таким образом, уменьшить выделение и увеличить скорость. Эти оптимизации показали значительное сокращение потребления памяти в путях перерисовки, в некоторых случаях экономия x10 при распределении памяти.

Для более подробного технического погружения вы можете посмотреть сегмент обзора API или сегмент .NET Community Standup, где Джереми Кун рассказывает об этих оптимизациях.

Вы можете взять тестовый проект здесь и самостоятельно проверить результаты, как и один из наших пользователей — Джереми Синклер:

И последнее, но не менее важное: мы расширили API TextRenderer, чтобы принимать перегрузки ReadOnlySpan char, потому что рисование и измерение текста — довольно распространенное действие. Это позволит значительно более эффективно отрисовывать текст, когда можно избежать выделения новых строк (нарезка другого ввода, построение массива символов на основе стека и т.д.).

Улучшения и исправления специальных возможностей

В течение последних нескольких лет команда обновляла Windows Forms SDK 20-летней давности, чтобы он соответствовал сегодняшним требованиям доступности и соответствию.

В .NET 5.0 мы внесли много улучшений, включая, помимо прочего, следующие:

  • Поддержка автоматизации пользовательского интерфейса для ряда элементов управления, включая:
    • Button,
    • ListView,
    • CheckBox,
    • RadioButton и др.
  • Поддержка LegacyIAccessible Control Pattern позволяет пользователям лучше взаимодействовать с элементами управления UI и позволяет разработчикам устанавливать настраиваемые свойства AccessibleRole для своих элементов управления.
  • Шаблоны элементов управления Text и TextRange позволяют пользователям извлекать текстовое содержимое, текстовые атрибуты и внедренные объекты из текстовых элементов управления.

Мы также исправили несколько проблем, которые влияли на UX при использовании некоторых инструментов доступности. Например, мы переработали реализации специальных возможностей таким образом, чтобы доступ к AccessibleObject больше не приводил к преждевременному созданию элемента управления Handle, что, в свою очередь, обеспечивает более предсказуемое поведение элементов управления и позволяет избежать неожиданных сюрпризов в пользовательском интерфейсе.

Мы также улучшили и исправили поведение в нескольких элементах управления (таких как PropertyGrid и MonthCalendar), которые могли помешать инструментам специальных возможностей правильно перемещаться по пользовательскому интерфейсу или, в тяжелых случаях, вызывать сбой приложений.

Поддержка Visual Basic

Visual Basic вместе с его Application Framework поддерживается в .NET 5 и Visual Studio 16.8! Visual Studio 16.8 включает конструктор Windows Forms Designer, поэтому Visual Basic готов для миграции существующих приложений или создания новых приложений.

Для получения дополнительной информации обратитесь к публикации Visual Basic WinForms Apps в .NET 5 и Visual Studio 16.8.

Критические изменения

Хотя мы намерены максимально поддерживать обратную совместимость с .NET Framework и .NET Core, это не всегда разумно. Вы можете найти список критических изменений здесь:

Используют ли сейчас Windows Forms или все перешли на WPF?

Windows Forms или WPF?
Добрый день! У меня есть необходимость написать некую корпоративную CRM систему для нужд.

WPF или Windows Forms. Сложность
Что лучше и проще в реализации? WPF или Windows Forms? Хотя даже не то, чтобы проще или лучше, что.

Что лучше Windows Forms или WPF?
Доброго времени суток! подскажите те кто имеет опыт чем отличается приложение WPF от Windows Forms.

Видео в бэкграунде WPF или Windows Forms?
Здравствуйте. Хочу сделать так,чтобы в моей программе бэкграундом было видео зацикленное. Можно так.

Читайте также:  Linux как открыть порт 3306

Добавлено через 8 минут
Storm23, а чем был обоснован выбор WinForms для этого проекта?

titan4ik, в оговоренных мною выше: если человек хорошо знает WinForms и от приложения не требуется красивых свистелок-перделок.

Добавлено через 1 минуту
Если технология хорошо выполняет поставленные перед ней задачи, то бросать её во имя моды не имеет смысла.

Хорошо, поправте если не прав:

Т.е. в WPF биндинг на UI части по сути вынесен в само представление, без дополнительных ивентов в самой модели. В формах нам нужно вручную сообщать внутри моделей об изменениях.

p.s. порог вхождения в WPF просто адский. =_=

Теоретически, если изначально в архитектуру заложить отделение View от модели, просунув между ними прослойку абстракции, то UI можно прикрутить какой угодно. Если делаете так, то фраза «пишу проект на винформах» звучит некорректно. Или заказчик принципиально хотел WinApi`шный интерфейс?

Добавлено через 2 минуты

Смелое, но неверное замечание.

Добавлено через 2 минуты

Никто не говорит, что в Винформах биндинг сделать так-же просто, как в WPF, но ведь можно. Тем-более, что есть и другие схемы построения архитектуры, не подразумевающие автоматический биндинг, например MVP.

Добавлено через 10 минут

Про всех сказать не могу, для себя определил следующие критерии:
1) Программа, не требующая особого пользовательского участия. Запустилась, сделала дело, написала «Ок» или «Не Ок» — консоль.
2) Минимальное участие пользователя — нажать кнопочку и/или ввести пару циферок (например, программа для удалённого обновления ПО наших контроллеров, где пользователь выбирает файл прошивки, задаёт адрес контроллера и нажимает кнопочку «Обновить») — винформ.
3) Программа с более сложным пользовательским интерфейсом, расчитаная, на «внешнего» пользователя — WPF.

Здесь надо оговориться, что, как я выше писал, паттерн MVC и его производные подразумевают отделение реализации UI от логики работы, что позволяет написать основной функционал отдельно и прикручивать к нему любой пользовательский интерфейс, вплоть до WEB`а.
Конкретно в винформах меня подкупает возможность реализации MDI «из коробки» и это «тот-самый тёплый ламповый» MDI (дочерние окна в родительском), а не модный нынче а-ля Photoshop (куча окошек не связанных между собой).

А WPF в данном случае (простой интерфейс) чем-то менее удобен? Чем именно?

Введение в Windows Forms — пишем первую программу

В данной статье будет рассказано о том как написать простой обработчик событий на C++ для приложения Windows Forms, работающего под управления .NET Framework. Мы создадим простейшую Windows программу, которая вычисляет факториал целого числа. Для написания данной программы Вам понадобится Visual Studio 2008 Express Edition или Professional.

Для начала создадим проект.

Откроем Visual Studio, далее жмем Файл→Создать→Проект, далее выбираем пункт CLR и отмечаем Приложение Windows Forms, даем имя проекта, к примеру factr и жмем Ok.

После того как мы создали проект, должна появиться пустая форма, которая должна выглядеть примерно так:

Справа должна появиться панель элементов, если ее нет, то можно включить ее в меню Вид→Панель Элементов или нажатием горячих клавиш — Ctrl + Alt + X.

На ней расположены различные элементы для вставки в форму, нам понадобятся только элементы Button (Кнопка), Label (Надпись) и TextBox (Текстовое поле). Перетащите на форму три элемента Label, Два элемента TextBox, и одну кнопку (Button), расставьте элементы примерно так:

Теперь нам нужно будет изменить текст надписей для элементов Label и Button и Задать подходящие имена классов для элементов TextBox. Для этого Выделите элемент label1, перейдите в Панель свойств, (обычно она находится под Панелью элементов, если панель выключена, включите ее в меню Вид -> Диспетчер свойств.) и задайте для данного элемента значение атрибута Text как показано на рисунке.

Читайте также:  Распознаватель речи для windows

Задайте атрибут Text для всех элементов Label и Кнопки Button аналогичным образом. Наша форма должна принять примерно следующий вид:

Я сделал кнопку развернуть неактивной, так как изменение размеров данной формы испортит ее внешний вид, Вы также можете это сделать, щелкнув левой кнопкой мыши на пустом месте формы и в Панели свойств задать для атрибута MaximizeBox параметр False.

Теперь задайте для текстовых полей (TextBox) Атрибуты Name в Панели Свойств – для первого поля это будет num1, а для второго, соответственно num2. Тем самым мы изменили имена классов для полей TextBox, чуть позднее Вы поймете зачем.

Итак, каркас формы готов, если откомпилировать и запустить программу, то мы увидим, какой будет наша форма на финише, правда сейчас она совершенно бесполезна. Перейдем к написанию обработчика событий для кнопки Button, т.е. что будет происходить при нажатии на эту кнопку, также мы напишем саму функцию вычисления факториала, которую мы будем использовать в обработчике.

Первым делом нужно добавить заголовочный файл fact.h в проект, для этого щелкаем правой кнопкой мыши в Обозревателе решений на папке Заголовочные файлы, далее меню Добавить -> Создать Элемент, вписываем название файла – fact.h и нажимаем Добавить. В данном файле будет содержаться прототип функции для вычисления факториала. Добавляем туда следующий исходный код.

Далее подключаем этот файл к проекту с помощью директивы #include – Открываем файл factr.cpp и добавляем после строчки #include «stdafx.h» следующий код.

Теперь наш заголовочный файл подключен к проекту, далее аналогичным образом создаем файл исходного кода fact.cpp в проект.

В него добавляем саму функцию вычисления факториала целого числа.

Теперь наш проект содержит функцию вычисления факториала, откомпилируйте его, если ошибок нет, то можно приступить к написанию обработчика событий для кнопки Button.

Открываем файл Form.h, в нем мы видим визуальное представление нашей формы. Щелкаем двойным щелчком на кнопке Button и переходим к исходному коду.

После фигурной скобки ставим абзац и приступаем к кодированию. Любой набор символов, которые мы вводим с клавиатуры в текстовое поле программы является строкой, поэтому нам нужно вытащить значение из текстового поля и привести его к целочисленному типу. Это довольно сложная процедура, но, к счастью в языке C++ уже есть множество функций, выполняющих конвертирование типов данных. Сначала нам необходимо описать и инициализировать переменную, в которой будет храниться значение числа, для которого должен быть вычислен факториал. Добавим в том место, где Вы поставили абзац следующий код:

Эта строка инициализирует переменную, которая хранит в себе число для вычисления его факториала. Далее нам нужно будет произвести вызов нашей функции fact с переменной number в качестве единственного аргумента и занести результат работы функции в новую переменную factor.

И затем преобразовать полученное значение обратно в строку и присвоить его второму текстовому полю.

Таким образом, наш простой обработчик событий будет выглядеть вот так:

Теперь можно скомпилировать и запустить готовую программу и проверить ее. Помните, что тип double в С++ может хранить число не превышающее !170.

Результат работы программы можно проверить в инженерном калькуляторе Windows.

Оцените статью