Стандартные меню приложений
Дерево свойств для создания и настройки меню упражнения
На схеме свойство ( Name ) взято в скобки, поскольку это не свойство элемента меню, а имя ссылки, адресующейся к объекту. Хотя у элементов управления все же есть свойство Name типа String, но его чаще всего используют как метку элемента для его узнаваемости в коллекции, но не как адресную ссылку.
Свойство ImageTransparentColor устанавливает цвет в изображении пиктограммы, который система должна считать прозрачным. В нашем случае каждая загружаемая пиктограмма имеет рамку цвета Magenta, и если не установить этот цвет в свойстве ImageTransparentColor, то рамка будет видна на пиктограмме в меню.
Когда снимают фильм со спецэффектами, передний план тоже снимают на фоне экрана, выкрашенного в однотонный редко встречающийся цвет. При монтаже цвет фона легко убирают и подсовывают вместо него любой нужный материал. Этот редкий экзотический цвет и можно считать ImageTransparentColor, который система считает прозрачным.
Добавление пиктограмм к объектам команд
Мы создали декларативным способом объекты команд всплывающего меню только для двух элементов верхнего уровня. Для третьего элемента объекты команд создадим программно чуть позже. Но сначала нужно в проект загрузить пиктограммы декларативно.
Изображения мы планируем добавить к следующим объектам команд:
Элемент меню | Файл с пиктограммой |
---|---|
itemOpen |
Open.bmp |
itemCut |
Cut.bmp |
itemCopy |
Copy.bmp |
itemPaste |
Paste.bmp |
itemDelete |
Delete.bmp |
itemSaveAs | Save.bmp |
Большинство современных компьютеров поддерживают глубину цвета 24 бита, поэтому готовые рисунки будем копировать из соответствующей папки с именем 24bitcolor, которую можно найти в прилагаемом каталоге Source (или в архиве C:\Program Files\Microsoft Visual Studio 8\Common7\VS2005ImageLibrary\VS2005ImageLibrary.zip ).
Пиктограммы в исполнимую сборку программы, для тренировки, будем загружать несколькими способами:
- Предварительно поместим рисунки в файл локальный ресурсов Form3.resx на этапе проектирования, код которого при компиляции будет внедрен в исполнимую сборку (файлы Cut.bmp и Copy.bmp )
- Добавим к проекту файлы рисунков и отметим в их свойствах, что это внедряемый ресурс ( Embedded Resource ), чтобы компилятор оболочки автоматически включил их код в исполнимую сборку (файл Paste.bmp )
- Присоединим пиктограмму немедленно к свойству Image элемента через стандартный файл глобальных ресурсов, используя графические средства оболочки (файл Delete.bmp )
- Добавим к проекту свой ( пользовательский ) файл глобальных ресурсов и поместим в него ресурс нужной картинки (файл Open.bmp )
- Будем загружать пиктограмму в элемент меню на этапе выполнения непосредственно из файла рисунка, который должен физически находиться вместе с исполнимой сборкой (файл Save.bmp )
Во всех случаях после компиляции код рисунков должен оказаться в сборке и мы во время исполнения будем присоединять его к элементам меню по мере необходимости, правда, немного по разному.
Способ 1. Загрузка рисунков через локальный файл ресурсов
- В панели Solution Explorer двойным щелчком на локальном XML -файле разметки Form3.resx вызовите редактор ресурсов и через первый узел меню установите режим Images
- Выполните команду Add Resource/Add Existing File меню редактора ресурсов и, удерживая клавишу Ctrl, добавьте в ресурс файлы Cut.bmp и Copy.bmp глубиной 24bitcolor из прилагаемого к работе каталога Source
- Выполните команду View Details меню View редактора ресурсов, чтобы отобразить представление ресурсов в виде таблицы
- Откройте панель Solution Explorer и убедитесь, что оболочка создала каталог Resources, в который скопировала отмеченные файлы
Оболочка автоматически присвоила ресурсам подходящие имена, которые мы можем изменить в панели Properties, выделяя соответствующие ресурсы. Здесь же мы можем указать, где физически до компиляции будут располагаться рисунки: в XML -файле ресурсов Form3.resx или в отдельных BMP -файлах, на которые в XML -файле разметки будут помещены только ссылки.
Пока у нас рисунки имеют состояние Linked at compile time, что означает, что при компиляции их код будет внедрен в исполнимую сборку прямо из BMP -файлов по ссылкам, помещенным в XML -файл Form3.resx. Поэтому присутствие BMP -файлов в проекте обязательно при каждой компиляции. При установке для любого рисунка опции Embedded in .resx оболочка уже на этапе проектирования сразу же физически разместит его код в файле Form3.resx. После чего мы можем удалить соответствующий BMP -файл из проекта.
Чтобы убедиться в сказанном, выполните следующее:
- В панели Solution Explorer вызовите контекстное меню для узла Form3.resx и выполните команду View Em, чтобы открыть XML -файл ресурсов в режиме разметки
- Убедитесь, что в конце XML -файла прописаны только ссылки на добавленные в проект файлы рисунков
<data name="Copy" type="System.Resources.ResXFileRef, System.Windows.Forms"> <value>Resources\Copy.bmp;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> </data> <data name="Cut" type="System.Resources.ResXFileRef, System.Windows.Forms"> <value>Resources\Cut.bmp;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> </data>
- В панели Solution Explorer вызовите контекстное меню для узла Form3.resx и выполните команду View Designer, чтобы открыть файл ресурсов в режиме визуального конструктора
- Выделите ресурс Cut и через панель Properties установите для него свойство Persistence в значение Embedded in .resx
- Вновь откройте Form3.resx в режиме View Em и убедитесь, что вместо ссылки на файл Cut.bmp оболочка включила в ресурс сам код этого рисунка
<data name="Copy" type="System.Resources.ResXFileRef, System.Windows.Forms"> <value>Resources\Copy.bmp;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> </data> <data name="Cut" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64"> <value> Qk02AwAAAAAAADYAAAAoAAAAEAAAABAAAAABABgAAAAAAAAAAAASCwAAEgsAAAAAAAAAAAAA/wD//wD/ /wD//wD//wD//wD//wD//wD//wD//wD//wD//wD//wD//wD//wD//wD//wD//wD//wD/u6GUl19FY0Iy oo2C/wD//wD//wD//wD//wD//wD//wD//wD//wD//wD//wD//wD/zYZjq2I/ilAzYkU3vb2+uZ+SZkM0 Xj8wqJGG/wD//wD//wD//wD//wD//wD//wD/3YNVw7KquJyOhU4zwMDAxYJhqmI+YzwpLyUj/wD//wD/ /wD//wD//wD//wD//wD/4YVXxbOqva6ojFI1vLi21HxSwrKqrpSGa0It/wD//wD//wD//wD//wD//wD/ /wD/2ph25YZWsGZBj1U4nHJdyXVNwbm1up6Qj1U2/wD//wD//wD//wD//wD//wD//wD/yLWs645d24JW n19AlGBHvnRP1XtPuWtFrYd0/wD//wD//wD//wD//wD//wD//wD//wD/yLau3pl234RWxo1wzHhN0nxR xpF3vaec/wD//wD//wD//wD//wD//wD//wD//wD//wD//wD/iHNmcWBWhmdVq56Z/wD//wD//wD//wD/ /wD//wD//wD//wD//wD//wD//wD/uLSxjoB0fm5jaV1VdnJu/wD//wD//wD//wD//wD//wD//wD//wD/ /wD//wD//wD/urCqopSLqKCZjoF3Y1tV/wD//wD//wD//wD//wD//wD//wD//wD//wD//wD//wD/vrGq oZSLyMbEzcXAa19Wra2u/wD//wD//wD//wD//wD//wD//wD//wD//wD//wD/qZuSsqijw8PD6OTifG9m qKmq/wD//wD//wD//wD//wD//wD//wD//wD//wD/u7i2o5aMvLq5/wD/3dzcvLKrpqGe/wD//wD//wD/ /wD//wD//wD//wD//wD//wD/v7izs6ie/wD//wD/y8vL4t3aoZeQ/wD//wD//wD//wD//wD//wD//wD/ /wD//wD//wD//wD//wD//wD//wD//wD//wD//wD//wD//wD//wD//wD/ </value> </data>
- Выделите ресурс Cut и через панель Properties верните свойство Persistence в прежнее значение Linked at compile time
Способ 2. Назначение рисункам свойств внедряемых ресурсов
Добавим к проекту файл рисунка Paste.bmp и сообщим компилятору о необходимости включать его код в исполнимую сборку.
- В панели Solution Explorer вызовите контекстное меню для папки Resources, в которой уже должны находиться файлы Cut.bmp и Copy.bmp с глубиной цвета 24bitcolor, и командой Add/Existing Item добавьте к проекту из каталога Source файл Paste.bmp с такой же глубиной цвета, предварительно установив для диалогового окна соответствующий фильтр
- Выделите файл Paste.bmp и в панели Properties установите для него Build Action = Embedded Resource
При такой настройке при компиляции код файла будет копироваться в исполнимую сборку.