Шаг 280.
Язык программирования C#. Начала.
Приложения с графическим интерфейсом. Меню и панель инструментов

    На этом шаге мы рассмотрим пример использования указанных компонентов.

    Далее описывается еще одна программа, при выполнении которой появляется окно с изображением животных. Но теперь мы для выбора изображения будем использовать главное меню и панель инструментов. Как выглядит в этом случае окно, показано на рисунке 1.


Рис.1. Окно с главным меню и панелью инструментов

    Окно в этом случае содержит изображение в центральной части. Под изображением есть кнопка с названием животного. Над изображением размещена панель инструментов из четырех кнопок. Каждая кнопка содержит миниатюрное изображение животного, а при наведении курсора мыши на кнопку появляется подсказка с названием животного (см. рисунок 1). В окне также есть главное меню из трех пунктов: Программа, Красивые и Сильные.

    Изображение в окне меняется при щелчке по кнопке на панели инструментов или при выборе команды из меню. Вместе с изображением меняется и название кнопки. При щелчке по кнопке окно закрывается.

    На рисунке 2 показано окно с изображением лисы. Также в окне раскрыт пункт меню Программа. В этом пункте всего одна команда Выход, при выборе которой завершается работа программы.


Рис.2. Содержимое пункта меню Программа

    На рисунке 3 показано окно программы с изображением енота. В окне открыт пункт меню Красивые. В этом пункте меню содержатся команды Лиса и Енот. Команды предназначены для выбора животного, изображение которого будет показано в окне.


Рис.3. Содержание пункта меню Красивые

    На рисунке 4 окно содержит изображение медведя, и при этом открыт пункт меню Сильные. В этом пункте меню есть две команды Волк и Медведь, предназначенные для выбора животного.


Рис.4. Содержание пункта меню Сильные

    Теперь рассмотрим программный код, выполнение которого приводит к появлению описанного выше окна.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using System.Drawing;
using System.Windows.Forms;

namespace pr280_1
{
    // Класс окна: 
    class MyForm: Form {
        // Путь к каталогу с изображениями:
        private string path="";
        // Ссылка на объект метки: 
        private Label pict;
        // Ссылка на объект кнопки: 
        private Button btn;
        // Конструктор: 
        public MyForm(): base() {
            // Размеры окна: 
            this.Size = new Size(240, 230);
            // Начальное положение окна: 
            this.StartPosition = FormStartPosition.CenterScreen; 
            // Заголовок окна: 
            this.Text = "B мире животных";
            // Окно постоянных размеров: 
            this.FormBorderStyle = FormBorderStyle.FixedSingle; 
            // Окно нельзя развернуть на весь экран: 
            this.MaximizeBox = false;
            // Объект для главного меню:
            MainMenu menu = new MainMenu();
            // Объект для пункта меню "Программа":
            MenuItem prog = new MenuItem("Программа");
            // Добавление команды в пункт меню "Программа": 
            prog.MenuItems.Add("Bыxoд", OnButtonClick);
            // Объект для пункта меню "Красивые":
            MenuItem beautiful = new MenuItem("Красивые");
            // Объект для команды "Лиса":
            MenuItem fox = new MenuItem("Лиса");
            // Обработчик для команды "Лиса": 
            fox.Click += (x, y) => { set("Лиса", "fox.jpg");
            };
            // Объект для команды "Енот":
            MenuItem raccoon = new MenuItem("Eнот");
            // Обработчик для команды "Енот": 
            raccoon.Click += (x, y) => { set("Енот","raccoon.jpg");
            };
            // Добавление команд в меню "Красивые":
            beautiful.MenuItems.Add(fox);
            beautiful.MenuItems.Add(raccoon);
            // Объект для пункта меню "Сильные": 
            MenuItem strong = new MenuItem("Сильные"); 
            // Объект для команды "Медведь": 
            MenuItem bear = new MenuItem("Медведь");
            // Обработчик для команды "Медведь": 
            bear.Click += (x, y) => {
                set("Медведь", "bear.jpg"); };
            // Объект для команды "Волк":
            MenuItem wolf = new MenuItem("Волк");
            // Обработчик для команды "Волк": 
            wolf.Click += (x, y) => {
                set("Волк", "wolf.jpg"); };
            // Добавление команд в меню "Сильные":
            strong.MenuItems.Add(wolf);
            strong.MenuItems.Add(bear);
            // Добавление пунктов в главное меню:
            menu.MenuItems.Add(prog);
            menu.MenuItems.Add(beautiful);
            menu.MenuItems.Add(strong);
            // Назначение главного меню для окна: 
            this.Menu = menu;
            // Объект для панели инструментов:
            ToolStrip ts = new ToolStrip();
            // Кнопки для панели инструментов:
            ToolStripButton tsbA = new ToolStripButton(Image.FromFile(path + "fox.jpg"));
            ToolStripButton tsbB = new ToolStripButton(Image.FromFile(path + "raccoon.jpg"));
            ToolStripButton tsbC = new ToolStripButton(Image.FromFile(path + "wolf.jpg"));
            ToolStripButton tsbD = new ToolStripButton(Image.FromFile(path + "bear.jpg"));
            // Всплывающие подсказки для кнопок
            // на панели инструментов:
            tsbA.ToolTipText = "Лиса";
            tsbB.ToolTipText = "Енот";
            tsbC.ToolTipText = "Волк";
            tsbD.ToolTipText = "Медведь";
            // Обработчики для событий, связанных со щелчком
            // по кнопкам на панели инструментов:
            tsbA.Click += (x, y) => fox.PerformClick();
            tsbB.Click += (x, y) => raccoon.PerformClick();
            tsbC.Click += (x, y) => wolf.PerformClick();
            tsbD.Click += (x, y) => bear.PerformClick();
            // Добавление кнопок на панель инструментов:
            ts.Items.Add(tsbA);
            ts.Items.Add(tsbB);
            ts.Items.Add(tsbC);
            ts.Items.Add(tsbD);
            // Добавление панели инструментов в окно: 
            this.Controls.Add(ts);
            // Объект метки: 
            pict = new Label();
            // Координаты и размеры метки:
            pict.SetBounds(35, 25, 154, 104);
            // Рамка для метки:
            pict.BorderStyle = BorderStyle.FixedSingle;
            // Добавление метки в окно: 
            this.Controls.Add(pict);
            // Объект кнопки: 
            btn = new Button();
            // Координаты кнопки:
            btn.Left = pict.Left + 20;
            btn.Top = pict.Bottom + 10;
            // Размеры кнопки:
            btn.Width = pict.Width - 40;
            btn.Height=30;
            // Шрифт для кнопки:
            btn.Font = new Font("Courier New", 12, FontStyle.Bold); 
            // Обработка события, связанного со щелчком 
            // по кнопке в окне: 
            btn.Click += OnButtonClick;
            // Добавление кнопки в окно: 
            this.Controls.Add(btn);
            // Программный щелчок на команде "Волк": 
            wolf.PerformClick();
        }
        // Закрытый метод (вызывается при щелчке
        // на команде из меню):
        private void set(string name, string file) {
            // Название для кнопки: 
            btn.Text = name;
            // Изображение для метки: 
            pict.Image = Image.FromFile(path + file);
        }
        // Закрытый метод (вызывается при щелчке 
        // по кнопке в окне):
        private void OnButtonClick(object obj, EventArgs ea){
            Application.Exit();
        }
    }

    // Главный класс: 
    class Program
    {
        [STAThread]
        // Главный метод: 
        static void Main()
        {
            // Отображение окна:
            Application.Run(new MyForm());
        }

    }
}
Архив проекта можно взять здесь.

    Класс окна MyForm создается наследованием класса Form. В классе есть несколько закрытых полей. Текстовое поле path содержит полный путь к каталогу с файлами изображений. Поле pict является объектной ссылкой класса Label и предназначено для запоминания ссылки на объект метки с изображением. Также мы используем поле btn. Это ссылка на объект кнопки (создается на основе класса Button).

    В конструкторе класса MyForm() задаются размеры окна (команда

  this.Size = new Size(240,230);
), его начальное положение (команда
  this.StartPosition = FormStartPosition.CenterScreen; 
), заголовок окна (команда
  this.Text = "B мире животных";
). Также мы используем окно постоянных размеров без пиктограммы максимизации окна: команды
  this.FormBorderStyle = FormBorderStyle.FixedSingle; 
и
  this.MaximizeBox = false;    .

    Объект для главного меню menu создается командой

  MainMenu menu = new MainMenu();
на основе класса MainMenu. В главное меню будут добавляться пункты, и для каждого из них нужно создать объект. Объекты для пунктов меню создаются на основе класса MenuItem. Название для пункта меню указывается в качестве аргумента конструктора. Соответственно, объекты для пунктов главного меню создаются командами
  MenuItem prog = new MenuItem("Программа");                    , 
  MenuItem beautiful = new MenuItem("Красивые");
и
  MenuItem strong = new MenuItem("Сильные");     . 
Для добавления пунктов в главное меню используется метод Add(). Метод вызывается из свойства MenuItems объекта главного меню. Аргументом методу передается ссылка на объект пункта меню. Речь идет о командах
  menu.MenuItems.Add(prog);       , 
  menu.MenuItems.Add(beautiful); 
и
menu.MenuItems.Add(strong);    . 
Правда здесь есть еще один момент. Мы создали объект menu, который может быть главным меню. Но этого мало. Нужно зарегистрировать данный объект как главное меню окна. Для этого свойству Menu объекта окна в качестве значения присваивается ссылка на объект menu командой
  this.Menu = menu;    .

    В пункты главного меню добавляются команды. Для добавления команды в пункт меню можно из его свойства MenuItems (ссылка на коллекцию элементов из пункта меню) вызывать метод Add(). Аргументами методу передают название команды и название метода, который будет вызываться при выборе команды. Так мы поступаем, когда инструкцией

  prog.MenuItems.Add("Bыxoд", OnButtonClick);
в пункт меню Программа добавляем команду Выход. В итоге в пункте меню Программа появляется команда Выход, при выборе которой будет вызываться метод OnButtonClick() (закрытый метод класса MyForm). В теле метода всего одна команда Application.Exit(), которой завершается работа приложения.

    Добавлять команду в пункт меню можно другим способом. В этом случае на основе класса MenuItem создается объект команды. Так происходит при выполнении инструкций

  MenuItem fox = new MenuItem("Лиса");    , 
  MenuItem raccoon = new MenuItem("Eнот");    , 
  MenuItem bear = new MenuItem("Медведь");   и 
  MenuItem wolf = new MenuItem("Волк");     . 

    Для добавления команд в пункты меню используется уже знакомый нам метод Add(), который вызывается из объекта пункта меню, а аргументом методу передается ссылка на объект команды. Примером являются инструкции

  beautiful.MenuItems.Add(fox);   , 
  beautiful.MenuItems.Add(raccoon);    , 
  strong.MenuItems.Add(wolf);    и 
  strong.MenuItems.Add(bear);   .

    Для определения обработчиков для команд, добавленных в пункты меню Красивые и Сильные, используются лямбда-выражения. Ссылка на анонимный метод, определенный с помощью лямбда-выражения, добавляется в список обработчиков события Click объекта команды меню. В теле анонимного метода вызывается закрытый метод set(). Метод set() получает два аргумента: текстовое значение name с названием для кнопки (команда

  btn.Text = name; 
в теле метода) и текстовое значение file, определяющее название файла с изображением животного. При выполнении команды
  pict.Image = Image.FromFile(path + file);
в теле метода на основе указанного файла создается объект изображения, и это изображение применяется для метки.

    Объект ts для панели инструментов создается на основе класса ToolStrip командой

  ToolStrip ts = new ToolStrip();    . 
Для кнопок, которые предполагается размещать на панели инструментов, создаются объекты. Объекты создаются на основе класса ToolStripButton. Аргументом конструктору класса передается ссылка на объект изображения, которое применяется для кнопки. Всплывающие подсказки для кнопки на панели инструментов задаем, присвоив текстовое значение свойству ToolTipText объекта кнопки.

    Обработку событий, связанных со щелчком по кнопкам на панели инструментов, мы реализуем следующим образом: при щелчке по кнопке происходит программное генерирование события, связанного с выбором соответствующей команды из меню. Для этого в список обработчиков события Click объекта кнопки добавляется анонимный метод, определяемый лямбда-выражением. В теле лямбда-выражения использован метод PerformClick(), выполнение которого означает программный щелчок по команде из меню (метод вызывается из объекта этой команды). Для добавления кнопок на панель инструментов из свойства Items (ссылка на коллекцию элементов панели меню) объекта панели вызывается метод Add(). Ссылка на объект добавляемой кнопки указывается аргументом метода. Наконец, командой

  this.Controls.Add(ts); 
панель инструментов добавляется в окно.

    Также в конструкторе создается объект метки, задаются ее размеры, положение и тип рамки. Метка добавляется в окно.

    Также создается кнопка. Определяются ее размеры, положение, шрифт, а в качестве обработчика регистрируется метод OnButtonClick(). После добавления кнопки в окно выполняется команда

  wolf.PerformClick();    , 
означающая программный щелчок на команде Волк. В результате для метки применяется изображение с волком, а также название Волк получает кнопка.

    В главном методе программы командой

  Application.Run(new MyForm());
отображается окно, описанное в самом начале этого шага.

    На следующем шаге мы рассмотрим контекстное меню.




Предыдущий шаг Содержание Следующий шаг