Курс Windows Forms
December 21, 2018

Курс по WinForms. Урок 4. Строка меню, изменение шрифта и открытие дочерних форм.

Здравствуйте! Сегодня мы добавим нашему калькулятору строку меню, будем менять шрифт и открывать дочерние формы. Погнали!


Строка меню - это та строка, которая расположена под строкой состояния (та, на которой есть кнопки "свернуть", "на весь экран" и "закрыть") Она есть не во всех программах, в основном в тех, где надо работать с файлами/данными и т.д.

Мы же добавим в нашу строку две меню - изменение шрифта и открытие самодельного текстового редактора.

Строка меню как элемент WinForms

Строка меню - это тоже элемент, как и кнопка, текст и др., так что можем мы его можем найти в панели элементов.

Перетаскиваем его на нашу форму и видим, что какой-то элемент перешел в самый низ, а сверху программы появился белый прямоугольник. Это и есть наша строка меню. Нажимаем на нее видим надпись "Вводить здесь" и поле для ввода. Как вы и без меня поняли, тут мы вводим название элементов меню.

Давайте назовем наш первый элемент - "Настройки", т.е. там пользователь будет менять настройки нашего калькулятора. После этого снизу от элемента появляется раскрывающийся панель - это внутренние элементы наших "настроек". Нажмите на стрелочку и в открывшийся меню мы видим четыре элемента: "MenuItem", "ComboBox", "Seperator" и "TextBox". Каждый из элементов есть и в панели элементов (кроме "Seperator") и вы, надеюсь, с ними уже знакомы. Если нет, то вот перечисление их функций:

  • MenuItem - это просто элемент, если на который вы наведете, из него выйдет еще менюшка с такими же элементами.
  • ComboBox (нет, это не коробка с "к-к-к-комбо!") - это раскрывающиеся меню с несколькими вариантами выбора, в котором можно выбрать только один.
  • Seperator - это просто перегородка или разделитель. Служит для разделения разных элементов. Удобен для разделения на категории.
  • TextBox - просто ввод текста. Можно, например, вписывать имя, или другие данные.
  • Label - в списке его нет, но чтобы его добавить надо вписать нужный текст в поле для ввода "Вводить здесь".

Просто введите текст "Открыть настройки" в поле для ввода "Вводить здесь".

Далее выбираем наш Label и открываем меню событий. Находим событие Click и устанавливаем ему метод SettingsOpen и далее жмем ПКМ по проекту и выбираем Добавить... -> Форма Windows. Называем новую форму "Настройки.cs" (да, я знаю, что лучше называть латиницей)

Дочерняя форма "Настройки.cs"

Теперь у нас есть вторая форма, но она не откроется, если ее не открыть. (да ладно) Чтобы это сделать надо зайти в наш метод SettingsOpen и создать в нем новый объект класса Настройки с именем settings (и зачем мы назвали его кириллицей???) и пишем метод Show объекта settings.

private void SettingsOpen(object sender, EventArgs e)
{
    Настройки settings = new Настройки();
    settings.Show();
}

Метод Show объекта класса позволяет показать какой-либо элемент. Однако не забывайте, что теперь форма Настройки - это дочерняя форма формы Form1, т.е. если вы закроете родительскую форму (Form1 если еще не поняли) то закроется и дочерняя. Чуть позднее мы обсудим вариант как открыть вторую форму не делая ее дочерней.

Изменение шрифта через FontDialog

Теперь заходим в конструктор формы Настройки.cs и добавляем в него FontDialog и Button с текстом "Выбрать шрифт". Задаем событию Click кнопки метод FontSelected. Теперь вписываем туда следующее:

private void FontSelected(object sender, EventArgs e)
{
    fontDialog1.ShowDialog(); //как вы можете заметить, класс fontDialog статичный и нам не требуется создавать объект
}

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

Нам надо выбрать шрифт калькулятора. Но как изменить сразу все элементы, ведь там их много? А вот так: в WinForms (и в WPF вроде бы тоже) если вы не устанавливаете свои значения определенным свойствам элементов формы, то они получают значения "по умолчанию", а это "по умолчанию" - это значения формы. Шрифт в том числе.

Однако, чтобы это сделать мы должны не менять значение шрифта по умолчанию (если значение изменено, то оно будет жирным). Но тут есть одна проблема - размер шрифта. К сожалению, если мы изменим хоть что-то, будь то размер шрифта или формат, весь шрифт будет показан как не по умолчанию и это вызывает некоторые проблемы, ведь мы сделали шрифт кнопок и первого операнда 15pt. У нас два варианта - либо сделать так, чтобы пользователь выбирал шрифт каждого элемента по отдельности, что будет долго и муторно как для разработчика, так и для пользователя, либо сделать кнопки и все другие элементы маленькими, что будет не особо красиво, если не сделать соответствующие правки. Я, пожалуй, сделаю кнопки маленькими.

Так, теперь всё, что нам надо сделать - задать нужные значения форме. А делать мы это будем обращаясь к свойству формы Font:

private void FontSelected(object sender, EventArgs e)
{
    Form1 calculator = new Form1();
    fontDialog1.ShowDialog();
    calculator.Font = fontDialog1.Font;
}

Заметьте, что у FontDialog нет шрифта, ведь сам элемент даже не видем и не имеет визуальных черт, а он лишь открывает сторонний диалог. Однако у него есть свойство Font, что у других элементов является шрифтом текста. Дело в том, что при вызове диалога шрифтов и выборе шрифта в нем FontDialog вставляет шрифт, который мы выбрали в свое свойство Font. У него также есть свойство DialogResult, но это только результат действия диалога, например, его отмена. (DialogResult.Cancel)

Конец

Фух, этот урок я делал долго и нашел довольно много информации для вас. Надеюсь, вам понравилось. Также, если вы еще не подписаны на мой телеграмм канал, подписывайтесь (тык!) До скорого и удачи!