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

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

Создание формы с заготовкой меню

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

  • Добавьте к проекту StripControls форму с именем Form4 командой Project/Add Windows Form

  • Поместите из панели Toolbox на форму кнопку Button (или любой другой элемент управления) и сразу удалите ее, чтобы явно прописалось конструктором оболочки свойство Name=Form4 формы в файле Form4.Designer.cs (или сами пропишите его в этом файле)
  • Откройте файл Start.cs в режиме View Designer, выделите объект списка listBoxChoice и добавьте в его свойство Items строку: "Упражнение 4."

  • Дополните файл Start.cs блоком кода, запускающим созданную форму Form4
// Если форма не запущена - запускаем
            if (!IsRun)
            {
                switch (formName)
                {
                    case "Form1":
                        frm = new Form1();
                        break;
                    case "Form2":
                        frm = new Form2();
                        break;
                    case "Form3":
                        frm = new Form3();
                        break;
                    case "Form4":
                        frm = new Form4();
                        break;
                }
    
                this.AddOwnedForm(frm);     // Сделать новую frm подчиненной Start
                // frm.Owner = this;        // Алтернативный способ назначить владельца
                frm.ShowInTaskbar = false;  // Не отображать метку окна в панели задач
                frm.Show();                 // Показать новую форму
            }
            else
                frm.Focus();                // Передать фокус запущенной форме
Листинг 28.35. Часть кода обработчика события SelectedIndexChanged, запускающего Form4
  • Откройте файл Form4.cs в режиме View Em и добавьте в него функцию CreateMenu() программного создания меню, которая будет иметь следующий код
// Видимые в методах класса поля-ссылки на элементы меню
        MenuStrip menu;
        ToolStripMenuItem itemFile;
        ToolStripMenuItem itemOpen;
        ToolStripMenuItem itemSaveAs;
        ToolStripMenuItem itemExit;
    
        ToolStripMenuItem itemEdit;
        ToolStripMenuItem itemCut;
        ToolStripMenuItem itemCopy;
        ToolStripMenuItem itemPaste;
        ToolStripMenuItem itemDelete;
    
        void CreateMenu()
        {
            // Создание меню
            menu = new MenuStrip();
            menu.Parent = this;
    
            // Формирование верхней линейки меню
            itemFile = new ToolStripMenuItem("&File");
            menu.Items.Add(itemFile);
            itemEdit = new ToolStripMenuItem("&Edit");
            menu.Items.Add(itemEdit);
    
            // Сборка узла File
            itemFile.DropDownItems.Add(itemOpen = new ToolStripMenuItem("&Open"));
            itemFile.DropDownItems.Add(itemSaveAs = new ToolStripMenuItem("Save &As..."));
            itemFile.DropDownItems.Add(new ToolStripSeparator());
            itemFile.DropDownItems.Add(itemExit = new ToolStripMenuItem("E&xit"));
    
            // Сборка узла Edit
            itemEdit.DropDownItems.Add(itemCut = new ToolStripMenuItem("Cu&t"));
            itemEdit.DropDownItems.Add(itemCopy = new ToolStripMenuItem("&Copy"));
            itemEdit.DropDownItems.Add(itemPaste = new ToolStripMenuItem("&Paste"));
            itemEdit.DropDownItems.Add(itemDelete = new ToolStripMenuItem("&Delete"));
        }
Листинг 28.36. Функция CreateMenu() создания меню программным способом
  • Добавьте в файл Form4.cs функцию LoadImage() загрузки пиктограмм меню из файла ресурсов через список изображений, которая будет представлена следующим кодом
// Создаем список для хранения изображений 
        ImageList imageList = new ImageList();
    
        void LoadImage()
        {
            // Присоединяем ранее сформированные ресурсы из файла ресурсов 
            ResourceReader rr = new ResourceReader("ResXForm4.resources");
            IDictionaryEnumerator en = rr.GetEnumerator();
            while (en.MoveNext())
            {
                switch (en.Key.ToString())
                {
                    default:
                        imageList.Images.Add(en.Key.ToString(), (Image)en.Value);
                        break;
                    case "icoTitle":
                        this.Icon = (Icon)en.Value;     // Иконка окна
                        break;
                    case "strTitle":
                        this.Text = (String)en.Value;   // Заголовок окна
                        break;
                }
            }
            rr.Close(); // Закрыли файл ресурсов
    
            // Определяем цвет, имитирующий прозрачность окраин пиктограмм 
            imageList.TransparentColor = Color.Magenta;
    
            // Закрепляем пиктограммы из списка за командами меню с помощью ключей
            itemOpen.Image = imageList.Images["Open"];
            itemSaveAs.Image = imageList.Images["Save"];
            itemCut.Image = imageList.Images["Cut"];
            itemCopy.Image = imageList.Images["Copy"];
            itemPaste.Image = imageList.Images["Paste"];
            itemDelete.Image = imageList.Images["Delete"];
        }
Листинг 28.37. Функция LoadImage() загрузки пиктограмм из файла ресурсов
  • Вставьте вызовы функций создания меню и загрузки изображений в конструктор класса Form4 и добавьте инструкции подключения библиотечных пространств имен
    • using System.Resources;
    • using System.Collections;

Общий код файла Form4.cs будет таким

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
    
namespace StripControls
{
    using System.Resources;
    using System.Collections;
    
    public partial class Form4 : Form
    {
        public Form4()
        {
            InitializeComponent();
    
            CreateMenu();// Создаем меню
    
            // Загружаем в меню пиктограммы опций
            LoadImage();
        }
    
        // Видимые в методах поля-ссылки на элементы меню
        MenuStrip menu;
        ToolStripMenuItem itemFile;
        ToolStripMenuItem itemOpen;
        ToolStripMenuItem itemSaveAs;
        ToolStripMenuItem itemExit;
    
        ToolStripMenuItem itemEdit;
        ToolStripMenuItem itemCut;
        ToolStripMenuItem itemCopy;
        ToolStripMenuItem itemPaste;
        ToolStripMenuItem itemDelete;
    
        void CreateMenu()
        {
            // Создание меню
            menu = new MenuStrip();
            menu.Parent = this;
    
            // Формирование верхней линейки меню
            itemFile = new ToolStripMenuItem("&File");
            menu.Items.Add(itemFile);
            itemEdit = new ToolStripMenuItem("&Edit");
            menu.Items.Add(itemEdit);
    
            // Сборка узла File
            itemFile.DropDownItems.Add(itemOpen = new ToolStripMenuItem("&Open"));
            itemFile.DropDownItems.Add(itemSaveAs = new ToolStripMenuItem("Save &As..."));
            itemFile.DropDownItems.Add(new ToolStripSeparator());
            itemFile.DropDownItems.Add(itemExit = new ToolStripMenuItem("E&xit"));
    
            // Сборка узла Edit
            itemEdit.DropDownItems.Add(itemCut = new ToolStripMenuItem("Cu&t"));
            itemEdit.DropDownItems.Add(itemCopy = new ToolStripMenuItem("&Copy"));
            itemEdit.DropDownItems.Add(itemPaste = new ToolStripMenuItem("&Paste"));
            itemEdit.DropDownItems.Add(itemDelete = new ToolStripMenuItem("&Delete"));
        }
    
        // Создаем список для хранения изображений 
        ImageList imageList = new ImageList();
    
        void LoadImage()
        {
            // Присоединяем ранее сформированные ресурсы из файла ресурсов 
            ResourceReader rr = new ResourceReader("ResXForm4.resources");
            IDictionaryEnumerator en = rr.GetEnumerator();
            while (en.MoveNext())
            {
                switch (en.Key.ToString())
                {
                    default:
                        imageList.Images.Add(en.Key.ToString(), (Image)en.Value);
                        break;
                    case "icoTitle":
                        this.Icon = (Icon)en.Value;     // Иконка окна
                        break;
                    case "strTitle":
                        this.Text = (String)en.Value;   // Заголовок окна
                        break;
                }
            }
            rr.Close(); // Закрыли файл ресурсов
    
            // Определяем цвет фона, воспринимаемый прозрачным
            imageList.TransparentColor = Color.Magenta;
    
            // Закрепляем пиктограммы из списка за командами меню с помощью ключей
            itemOpen.Image = imageList.Images["Open"];
            itemSaveAs.Image = imageList.Images["Save"];
            itemCut.Image = imageList.Images["Cut"];
            itemCopy.Image = imageList.Images["Copy"];
            itemPaste.Image = imageList.Images["Paste"];
            itemDelete.Image = imageList.Images["Delete"];
        }
    }
}
Листинг 28.38. Полный код файла Form4.cs
  • Запустите на выполнение Упражнение 4 и убедитесь, что пиктограммы нормально загружаются из файла ресурсов через список изображений, а также успешно подгружаются и другие необходимые приложению ресурсы (пиктограмма и строка заголовка окна)


Александр Очеретяный
Александр Очеретяный
Украина, Киев
Анастасия Балыбердина
Анастасия Балыбердина
Украина, Киев, НТУУ КПИ