Опубликован: 13.07.2010 | Уровень: специалист | Доступ: платный
Самостоятельная работа 28:

Стандартные меню приложений

Создание элементов меню программным способом

Меню View будет управлять формой представления рисунков элементом pictureBox, который мы добавили на Form3 ранее. Через общий обработчик элементов меню View мы будем передавать в pictureBox требуемые значения его свойства SizeMode из библиотечного перечисления PictureBoxSizeMode. Закрепленное за элементом меню значение перечисления PictureBoxSizeMode будем сохранять в свойстве Tag элемента и извлекать его в обработчике с последующей распаковкой ссылочного типа Object в значимый тип PictureBoxSizeMode.

Схема свойств меню View

Здесь свойство Name - это свойство элемента типа String, а не имя ссылки с адресом объекта. При настройке элементов меню по приведенному ниже коду не забудьте начать набор строки регистрации обработчика события Click для первого элемента DropDownItems[0] вручную - с применением клавиши Tab. Это позволит создать обработчик с правильной сигнатурой. После правильного создания общего обработчика для подписки события Click последующих элементов можно воспользоваться упрощенным синтаксисом.

  • Добавьте в класс Form3 функцию с именем CreateView() для создания и настройки элементов меню View. Код функции соответствует приведенной выше схеме и представлен ниже
// Функция создания элементов меню View программным способом
        void CreateView()
        {
            // Имя элемента меню на верхнем уровне для возможности 
            // адресации в коллекции Items по его имени 
            itemView.Name = "View";
    
            ToolStripMenuItem item=new ToolStripMenuItem("&Normal");
            item.Tag = PictureBoxSizeMode.Normal;
            // Создайте вручную!!!!!!!
            item.Click += new EventHandler(ViewOnClick);
            itemView.DropDownItems.Add(item);// Добавили в коллекцию View 
            // Имя элемента меню View для возможности адресации
            // в коллекции DropDownItems по его имени
            item.Name = "Normal";
            // Отмечаем флажок, поскольку в начальном состоянии 
            // свойство SizeMode элемента PictureBox именно Normal
            item.Checked = true;
    
            item = new ToolStripMenuItem();
            item.Text = "&Center";
            item.Tag = PictureBoxSizeMode.CenterImage;
            item.Click += ViewOnClick;
            itemView.DropDownItems.Add(item);
            item.Name = "Center";
    
            item = new ToolStripMenuItem("&Stretch");
            item.Tag = PictureBoxSizeMode.StretchImage;
            item.Click += ViewOnClick;
            itemView.DropDownItems.Add(item);
            item.Name = "Stretch";
    
            item = new ToolStripMenuItem();
            item.Text = "&Zoom";
            item.Tag = PictureBoxSizeMode.Zoom;
            item.Click += ViewOnClick;
            itemView.DropDownItems.Add(item);
            item.Name = "Zoom";
    
            item = new ToolStripMenuItem("&AutoSize");
            item.Tag = PictureBoxSizeMode.AutoSize;
            item.Click += ViewOnClick;
            itemView.DropDownItems.Add(item);
            item.Name = "AutoSize";
        }
Листинг 28.20. Функция CreateView() для динамического создания элементов меню View

Еще раз вспомним, что порядок следования кода добавления элементов в коллекцию определяет их порядок прорисовки в работающем приложении. При создании элементов меню View мы поочередно используем разные перегрузки конструктора класса ToolStripMenuItem. Мы задаем свойству Tag типа Object упакованное значение перечисления PictureBoxSizeMode, чтобы затем в обработчике распаковать его. Помечая элемент значением свойства Name мы перестраховываемся на тот случай, если вдруг далее нам придется к нему адресоваться в коллекции по синтаксису ассоциативного массива (адресация в массиве по индексу или по имени).

  • Вставьте в конец конструктора Form3() одноименного класса код вызова функции CreateView()
public partial class Form3 : Form
    {
        public Form3()
        {
            InitializeComponent();
    
            LoadImages();// Присоединяем пиктограммы 
    
            CreateView();// Динамически заполняем меню View
        }
Листинг 28.21. Код вызова функции CreateView() в конструкторе класса Form3
  • В созданный обработчик ViewOnClick() внесите следующий код
void ViewOnClick(object sender, EventArgs e)
        {
            // Приводим ссылку на элемент меню View, сгенерировавший событие 
            ToolStripMenuItem item = (ToolStripMenuItem)sender;
    
            // Распаковываем объект и используем сохраненную 
            // в нем информацию для управления контейнером рисунков
            pictureBox.SizeMode = (PictureBoxSizeMode)item.Tag;
    
            ////////////////////////////////////////////////////////
            // Управление флажками выполним в обработчике события
            // DropDownOpening, которое информирует о раскрытия узла View
            ////////////////////////////////////////////////////////
            //////////// Следующий код закомментирован /////////////
            ////////////      Жалко выбрасывать!!!     /////////////
            /*//////////////////////////////////////////////////////
            // Сбрасываем флажки всех элементов 
            foreach (ToolStripMenuItem it in itemView.DropDownItems)
                it.Checked = false;
            // Устанавливаем флажок на выделенном элементе,
            // адресуясь к коллекции по имени элемента
            ((ToolStripMenuItem)itemView.DropDownItems[item.Name]).Checked = true;
            //item.Checked = true;  // Альтернативный вариант
            //*/////////////////////////////////////////////////////
        }
Листинг 28.22. Код обработчика ViewOnClick() элементов меню View
  • Запустите Упражнение 3 и убедитесь, что команды узла View динамически формируются


Иван Циферблат
Иван Циферблат
Россия, Таганрог, 36, 2000