Опубликован: 13.07.2010 | Доступ: свободный | Студентов: 891 / 20 | Оценка: 4.40 / 4.20 | Длительность: 77:34:00
Самостоятельная работа 28:

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

Способ 3. Присоединение рисунка к свойству Image элемента меню через стандартный файл глобальных ресурсов проекта

Присоединим к свойству Image элемента меню itemDelete файл с рисунком Delete.bmp через стандартный файл глобальных ресурсов. Этот файл может хранить в себе множественные ресурсы, которые доступны в любом месте кода программы.

  • Откройте файл Form3.cs в режиме View Designer, выделите через раскрывающийся список панели Properties элемент itemDelete, раскройте его свойство Image и для режима Project resource file загрузите в элемент кнопкой Import файл Delete.bmp из прилагаемого к работе каталога Source

Загруженная пиктограмма немедленно появится слева от команды Delete на меню формы


  • Откройте в каталоге Properties проекта стандартный файл глобальных ресурсов Resources проекта в режиме View Em и убедитесь, что оболочка поместила относительную ссылку на Delete.bmp в этот файл
<data name="Delete" type="System.Resources.ResXFileRef, System.Windows.Forms">
    <value>..\Resources\Delete.bmp;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
  </data>
  • Откройте файл Form3.Designer.cs и в секции #region убедитесь, что оболочка сразу прописала код присоединения рисунка к элементу меню
// 
            // itemDelete
            // 
            this.itemDelete.Image = global::StripControls.Properties.Resources.Delete;

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

Замечание. Если пытаться немедленно присоединить к элементу файл рисунка через локальный ресурс в использованном нами окне Select Resource, то оболочка выкинет все ранее присоединенные файлы из этого ресурса (В нашем случае Cut и Copy ) и оставит только один непосредственно присоединяемый к элементу управления ресурс.

Способ 4. Размещение рисунка в пользовательском файле глобальных ресурсов

Загрузим рисунок Open.bmp в файл пользовательский глобальных ресурсов MyResources.resx, который нужно создать и добавить к проекту в любое место.

  • В панели Solution Explorer вызовите контекстное меню для папки Resources и добавьте в нее командой Add/New Item новый файл глобальных ресурсов с именем MyResources.resx

  • В панели Solution Explorer двойным щелчком на файле Resources.resx откройте его в режиме View Designer
  • Переведите редактор в режим Images и командой Add Resource/Add Existing File добавьте к проекту файл Open.bmp глубиной цвета 24bitcolor из прилагаемого каталога Source точно также, как мы это делали ранее при загрузке файлов Cut.bmp и Copy.bmp в локальный ресурс Form3.resx

Оболочка физически скопирует файл Open.bmp в каталог Resources проекта и пропишет относительную ссылку на него в пользовательском XML -файле разметки MyResources.resx глобальных ресурсов

<data name="Open" type="System.Resources.ResXFileRef, System.Windows.Forms">
    <value>..\Resources\Open.bmp;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, 
      Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
  </data>

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

Способ 5. Загрузка пиктограммы из файла рисунка во время выполнения

Файл Save.bmp мы будем загружать в элемент itemSaveAs непосредственно во время выполнения программы. Поэтому нужно присоединить его к проекту и настроить свойства так, чтобы оболочка при компиляции копировала этот файл в место размещения исполнимой сборки.

  • В панели Solution Explorer вызовите контекстное меню для папки Resources и командой Add/Existing Item добавьте в проект файл Save.bmp ( 24bitcolor ) из прилагаемого каталога Source
  • Выделите скопированный файл Save.bmp и через панель Properties установите свойство Copy to Output Directory в значение Copy if newer, чтобы оболочка скопировала файл в каталог размещения исполнимой сборки

Динамическое присоединение пиктограмм к элементам меню

Итак, на предудущих этапах работы мы загрузили все нужные файлы с пиктограммами в файлы ресурсов проекта или просто в каталог Resources проекта. Ресурс файла Delete.bmp мы сразу присоединили к свойству Image элемента меню itemDelete, поэтому дальнейших действий для этого элемента никаких не требуется. Ресурсы остальных пиктограмм пропишем в коде и они будут присоединяться к элементам меню на этапе выполнения программы.

  • Откройте файл Form3.cs в режиме View Em и добавьте в класс Form3 следующую функцию с именем LoadImages() для присоединения рисунков к элементам меню
// Загрузка изображений в элементы меню
        void LoadImages()
        {
            // Присоединяем 2 пиктограммы из 
            // файла локальных ресурсов Form3.resx 
            ResourceManager resources =
                new ResourceManager(typeof(Form3));//или (this.GetType())
            itemCopy.Image = (Image)resources.GetObject("Copy");
            itemCut.Image = (Image)resources.GetObject("Cut");
    
            // Присоединяем пиктограмму из файла,
            // помеченного как Embedded Resource 
            itemPaste.Image = new Bitmap(this.GetType(),    // или (typeof(Form3)
                "Resources.Paste.bmp");
    
            ///////////////////////////////
            // Пиктограмма для Delete внедрена декларативно
            // через стандартный файл глобальных ресурсов,
            // поэтому для нее ничего не делаем 
            ///////////////////////////////
    
            // Присоединяем пиктограмму из пользовательского 
            // файла глобальных ресурсов MyResources.resx 
            itemOpen.Image = Resources.MyResources.Open;
    
            // Присоединяем пиктограмму непосредственно из файла рисунка
            itemSaveAs.Image = new Bitmap("Resources\\Save.bmp");
        }
Листинг 28.18. Функция загрузки изображений в элементы меню в классе Form3
  • Вставьте в конструктор класса Form3 после вызова метода InitializeComponent() следующий код, выполняющий присоединение
public Form3()
        {
            InitializeComponent();
    
            LoadImages();// Присоединяем пиктограммы 
        }
Листинг 28.19. Вызов метода LoadImages() в конструкторе класса Form3
  • Запустите Упражнение 3 на выполнение и убедитесь в наличии пиктограмм для назначенных элементов меню


Обратите внимание на то, что для меню View заготовлен только узел itemView, а его коллекция DropDownItems пока пуста, поскольку ранее мы договорились наполнить ее программным способом. Вот это сейчас мы и выполним.