Проектирование интерфейса. Меню
Пример построения документа с собственным меню
Обобщим приведенные сведения по построению меню и создадим документ, в котором все встроенные меню будут отключены и создано собственное иерархическое меню. На верхнем уровне меню будет состоять из одного пункта, оно будет включать два подменю, каждое из которых содержит по одной команде. Приведем процедуру, реализующую создание такого меню:
Option Explicit Public Sub CreateCustomMenu() Dim CstmBar As CommandBar Dim CstmPopUp1 As CommandBarPopup, CstmPopUp2 As CommandBarPopup Dim CstmCtrl As CommandBarControl Dim Exist As Boolean 'Выключаем все панели For Each CstmBar In CommandBars CstmBar.Enabled = False Next CstmBar 'Создаем, включаем и делаем видимой собственную панель Exist = False For Each CstmBar In CommandBars If CstmBar.Name = "Головное меню" Then Exist = True Exit For End If Next CstmBar If Not Exist Then Set CstmBar = CommandBars.Add(Name:="Головное меню", _ Position:=msoBarTop, MenuBar:=True, Temporary:=False) End If CstmBar.Enabled = True CstmBar.Visible = True 'Добавляем меню на панель Exist = False For Each CstmCtrl In CstmBar.Controls If CstmCtrl.Caption = "&Ввод документов" Then Exist = True Exit For End If Next CstmCtrl If Not Exist Then Set CstmCtrl = CstmBar.Controls _ .Add(Type:=msoControlPopup, Before:=1) CstmCtrl.Caption = "&Ввод документов" 'Добавляем две команды подменю Set CstmPopUp1 = CstmCtrl.Controls.Add(Type:=msoControlPopup) CstmPopUp1.Caption = " о движении товаров" Set CstmPopUp2 = CstmCtrl.Controls.Add(Type:=msoControlPopup) CstmPopUp2.Caption = " финансовых" 'Добавляем команду в каждое подменю Set CstmCtrl = CstmPopUp1.Controls.Add(Type:=msoControlButton) CstmCtrl.Caption = "Накладная" CstmCtrl.OnAction = "Module1.Invoice" Set CstmCtrl = CstmPopUp2.Controls.Add(Type:=msoControlButton) CstmCtrl.Caption = "Счет" CstmCtrl.OnAction = "Module1.Account" End If End Sub11.1.
Заметьте, вначале, используя свойство Enabled, были отключены все панели. Затем было сформировано головное меню, содержащее всего один пункт, с двумя подменю и командами. Обратите внимание, перед добавлением нового пункта, обычно делается проверка, а не был ли он уже добавлен. Подобная проверка позволяет избежать ошибок, возникающих при попытках добавить уже существующий пункт или удалить несуществующий. Чтобы наш пример был законченным, приведем процедуры, вызываемые в ответ на выбор команд меню Накладная и Счет:
Public Sub Invoice() MsgBox ("Накладная!") End Sub Public Sub Account() MsgBox ("Счет!") End Sub
Вот как выглядит документ по завершении работы процедуры CreateCustomMenu:
В заключение, приведем процедуру, восстанавливающую стандартное окружение:
Public Sub ResetMainMenu() Dim CstmBar As CommandBar 'Включаем все панели For Each CstmBar In CommandBars CstmBar.Enabled = True Next CstmBar Set CstmBar = CommandBars.Item("Menu Bar") CstmBar.Visible = True End Sub
Группировка команд меню
Разделение групп логически связанных команд меню горизонтальными линиями позволяет пользователям более эффективно работать с большими меню, содержащими разнотипные команды. Сами разделяющие линии командами не являются. Установить или убрать их можно в диалоговом окне Настройка. Для этого в этом окне сделайте видимым модифицируемое меню. Затем щелкните правой кнопкой мыши команду, над которой хотите провести линию. В появившемся меню выберите команду Начало группы (Begin Group). Убирается линия аналогично.
Ту же задачу разбиения команд на группы можно решить из VBA, присвоив значение True свойству BeginGroup (Начало группы) объекта, представляющего команду, которая должна открывать очередную группу. Чтобы убрать разделяющую линию, присвойте этому свойству False. Вот как выделить группу команд меню "Ввод документов", начинающуюся со вставленной команды "ввод накладной":
Set InvCommand = CommandBars("Головное меню").Controls("Ввод документов") _ .Controls("ввод накладной") InvCommand.BeginGroup = True
Удаление команд меню
Удаление команд, подменю и меню позволяет упростить работу с приложением, приспособить его к нуждам отдельного пользователя. В Office 2000 можно удалять встроенные и пользовательские выпадающие меню из панелей меню, дочерние подменю из родительских меню, команды из всех видов меню. Единственное, чего сделать нельзя - удалить встроенную панель меню или встроенное всплывающее меню, даже если из них удалены все команды. Главное, что этого делать не нужно ни в коем случае. Панель можно сделать только недоступной или невидимой, что мы и демонстрировали в наших примерах.
Удаленные из меню встроенные подменю и команды можно восстановить в нужный момент. Собственные же удаленные подменю и команды придется при необходимости воссоздавать заново.
Удаление команды с помощью окна Настройка
Для удаления компонента меню нужно в диалоговом окне Настройка модифицируемое меню сделать видимым, щелкнуть правой кнопкой мыши удаляемый элемент и в появившемся меню выбрать команду Удалить (Delete).
Чтобы удалить целиком пользовательскую панель меню, нужно перейти на вкладку Панели инструментов диалогового окна Настройка и, выбрав в списке Панели инструментов имя удаляемой панели меню, щелкнуть кнопку Удалить.
Удаление команды с помощью VBA
Для удаления компонента меню используется метод Delete (Удалить). Этот оператор, например, удаляет выпадающее подменю Favorites из панели меню Web:
CommandBars("Web").Controls("Favorites").Delete
Собственную (пользовательскую) панель меню "Головное меню" можно целиком удалить оператором:
CommandBars("Головное меню").Delete
Как восстановить удаленные встроенные компоненты меню
Восстановить можно только встроенный удаленный элемент меню. Как и другие действия над меню, это делается в окне Настройка или из VBA. Если при этом восстановится заголовок выпадающего меню или подменю, вместе с ним восстановится само меню и все его потомки.
Как всегда, в диалоговом окне Настройка нужно сделать модифицируемое меню видимым. Затем, щелкнув правой кнопкой мыши заголовок выпадающего меню или подменю, которое нужно восстановить, в появившемся меню выберите команду Сброс (Reset).
Чтобы восстановить встроенную панель меню, перейдите на вкладку Панели инструментов окна Настройка, выберите в списке Панели инструментов имя восстанавливаемой панели меню и щелкните кнопку Сброс(Reset).
Восстановить встроенный компонент меню программно можно методом Reset. Например, следующий оператор восстанавливает выпадающее подменю Favorites из панели меню Web:
CommandBars("Web").Controls("Favorites").Reset
А вот как восстановить всю панель меню Menu Bar из Word:
CommandBars("Menu Bar").Reset