НАСТРОЙКА МЕНЮ И ПАНЕЛЕЙ ИНСТРУМЕНТОВ

Две наиболее важных коллекции, касающиеся меню MenuBar, MenuGroups. Первая содержит все отображаемые меню, вторая группы меню, часть из которых может не отражаться на экране. Группы меню могут содержать панели инструментов.

ИССЛЕДОВАНИЕ КОЛЛЕКЦИИ MENUGROUPS

Каждая группа меню содержит коллекции PopupMenus и Toolbars. Схема такова MenuBar-PopupMenu.
MenuGroups-MenuGroup.
В составе MenuGroup - PopupMenus и Toolbars.
PopupMenus-PopupMenu-PopupMenuItem, Toolbars-Toolbar-ToolbarItem.

ЗАГРУЗКА ГРУПП МЕНЮ

Выполняется методом Load, если параметр BaseMenu установлен=True, загружается новая группа меню, как основное меню аналогично команде MENU. Если этот параметр не указать, то загружается частичное меню, аналогично тому как это делает команда MENULOAD. Сразу после загрузки частичное меню может быть вставлено в панель меню методом InsertMenuInMenuBar или InsertInMenuBar. Так же становятся доступны все меню и панели инструментов входящие в меню. Далее можно Пример загрузки группы меню:

ThisDrawing.Application.MenuGroups.Load "acad.mnc"

СОЗДАНИЕ НОВОЙ ГРУППЫ МЕНЮ

AutoCAD ActiveX не позволяет создавать пустую группу меню, однако можно загрузить существующую и сохранить с новым именем и в новом файле. После чего его можно отредактировать по своему желанию. Приимущество данного подхода в том, что оказываются уже созданными базовые меню Файл, Окно и Помощь. Пример сохранения группы меню в новом файле:

ThisDrawing.Application.MenuGroups.Item(0).SaveAs "MyMenu.mnc", acMenuFileCompiled

ИЗМЕНЕНИЕ ПАНЕЛИ МЕНЮ

Основное меню может быть полностью замещено загружаемым если оно загружается как основное меню. Кроме того могут быть модифицированы и отдельные меню. Оба метода InsertMenuInMenuBar и InsertInMenuBar преследуют одну цель. Различие между ними в объекте из которого они вызываются. Первый вызывается из коллекции PopupMenus, требует имя меню и точку вставки. Второй вызывается непосредственно из объекта PopupMenu и требует только указания точки вставки. Вам решать какой метод избрать. Пример вставки меню:
Sub InsertMenu()
  ' Определим переменную для группы меню
  Dim currMenuGroup As AcadMenuGroup
  Set currMenuGroup = ThisDrawing.Application.MenuGroups.Item(0)

  ' Создадим меню
  Dim newMenu As AcadPopupMenu
  Set newMenu = currMenuGroup.Menus.Add("TestMenu")

  ' Определим переменную для пункта меню
  Dim newMenuItem As AcadPopupMenuItem
  Dim openMacro As String

  ' Назначим макрос аналог "ESC ESC _open " и создадим пункт меню
  openMacro = Chr(3) + Chr(3) + Chr(95) + "open" + Chr(32)
  Set newMenuItem = newMenu.AddMenuItem(newMenu.Count + 1, "Open", openMacro)

  ' Отобразим меню
  currMenuGroup.Menus.InsertMenuInMenuBar "TestMenu", ""
End Sub

УДАЛЕНИЕ МЕНЮ ИЗ ПАНЕЛИ МЕНЮ

Для данной цели используйте один из следующих методов RemoveMenuFromMenuBar или RemoveFromMenuBar. Различия между ними те же что и для вышеописанных методов добавления меню. Пример удаления: currMenuGroup.Menus.RemoveMenuFromMenuBar ("TestMenu") В результате меню становятся невидимым, но физически не удаляется. Пример переупорядочивания меню (первый пункт переносится в конец):
Sub MoveMenu()
  ' Определим переменную содержащую меню
  Dim moveMenu As AcadPopupMenu
  Dim MyMenuBar As AcadMenuBar
  Set MyMenuBar = ThisDrawing.Application.menuBar

  ' установим moveMenu равным первому
  Set moveMenu = MyMenuBar.Item(0)

  ' уберем с первой позиции
  MyMenuBar.Item(0).RemoveFromMenuBar

  ' вставим в последнюю
  moveMenu.InsertInMenuBar (MyMenuBar.count)
End Sub
В результате меню File должно переехать в последнюю позицию.

СОЗДАНИЕ И РЕДАКТИРОВАНИЕ ВЫПАДАЮЩИХ И ВСПЛЫВАЮЩИХ МЕНЮ

Оба типа меню отображаются как каскадные меню. Последние, например позволяют включать-включать объектную привязку. Выпадающие меню могут содержать до 999 пунктов. А всплывающие только до 499. Оба предела включют все меню в иерархии. Если меню не умещается на экране, то оно грубо обрезается. Всплывающие появляются обычно рядом с перекрестием. Если свойство ShortcutMenu=TRUE значит это оно и есть.

СОЗДАНИЕ МЕНЮ

Методом Add можно добавить объект PopupMenu в коллекцию PopupMenus. Для создания нового всплывающего старое следует сначала удалить. Может быть только одно такое меню на группу. Если таких меню нет, то можно создать его с именем "POP0". После чего по этому имени можно обращаться к меню в коллекции. Меню может включать и некторые специальные символы. Пример создания выпадающего меню:
Sub CreateMenu()
  Dim currMenuGroup As AcadMenuGroup
  Set currMenuGroup = ThisDrawing.Application.MenuGroups.Item(0)
  Dim newMenu As AcadPopupMenu
  Set newMenu = currMenuGroup.Menus.Add("TestMenu")
End Sub

ДОБАВЛЕНИЕ ПУНКТА К МЕНЮ

Метод AddMenuItem добавляет пункт в выпадающее меню, принимает четыре параметра - Index, Label, Tag, Macro. Index начинается с нуля, для добавления в конец установи индекс = значению свойства Count. Label - строка, определяющая содержание и формат пункта меню. (может содержать DEISEL выражение и специальные коды). Текст пункта меню еще называют Caption. Тэг - строка символов, включая подчеркивание идентифицирующая пункт меню. Макро - набор команд, выполняющихся при выборе пункта меню. Может быть как простым макросом вызывающим команду так и сложным набором команд. Пример добавления пункта меню:
Sub AddAMenuItem()
  Dim currMenuGroup As AcadMenuGroup
  Set currMenuGroup = ThisDrawing.Application.MenuGroups.Item(0)
  Dim newMenu As AcadPopupMenu
  Set newMenu = currMenuGroup.Menus.Add("TestMenu")

  ' добавим пункт
  Dim newMenuItem As AcadPopupMenuItem
  Dim openMacro As String
  ' назначим макрос эквивалентный "ESC ESC _open "
  openMacro = Chr(3) + Chr(3) + Chr(95) + "open" + Chr(32)

  Set newMenuItem = newMenu.AddMenuItem(newMenu.count + 1, "Open", openMacro)

  ' Отобразим
  newMenu.InsertInMenuBar(ThisDrawing.Application.menuBar.count + 1)
End Sub
Для добавления разделителя между пунктами меню используйте метод AddSeparator.

ДОСТУП К ГОРЯЧИМ КЛАВИШАМ

Для назначения горячей клавиши используйте символ & непосредственно перед буквой, которая и будет горячей. Пример:
Sub AddAMenuItem()
  Dim currMenuGroup As AcadMenuGroup
  Set currMenuGroup = ThisDrawing.Application.MenuGroups.Item(0)
  Dim newMenu As AcadPopupMenu
  Set newMenu = currMenuGroup.Menus.Add("Te" + Chr(Asc("&")) + "stMenu")

  Dim newMenuItem As AcadPopupMenuItem
  Dim openMacro As String
  openMacro = Chr(3) + Chr(3) + Chr(95) + "open" + Chr(32)
  Set newMenuItem = newMenu.AddMenuItem(newMenu.count + 1, Chr(Asc("&")) _
      + "Open", openMacro)

  newMenu.InsertInMenuBar(ThisDrawing.Application.menuBar.count + 1)
End Sub

СОЗДАНИЕ КАСКАДНЫХ ПОДМЕНЮ

Для этой цели используйте метод AddSubmenu который создает новый объект PopupMenu и добавляет его в меню. Принимает три параметра - Index, Label и Tag. Данный метод не возвращает объект PopupMenu вместо этого он возвращает новое меню на которое указывает подменю, это меню следует добавить в существующее. Пример:
Sub AddASubMenu()
  Dim currMenuGroup As AcadMenuGroup
  Set currMenuGroup = ThisDrawing.Application.MenuGroups.Item(0)

  Dim newMenu As AcadPopupMenu
  Set newMenu = currMenuGroup.Menus.Add("TestMenu")

  ' Добавим подменю
  Dim FileSubMenu As AcadPopupMenu
  Set FileSubMenu = newMenu.AddSubMenu("", "OpenFile")

  ' Добавим пункт в подменю
  Dim newMenuItem As AcadPopupMenuItem
  Dim openMacro As String
  openMacro = Chr(3) + Chr(3) + Chr(95) + "open" + Chr(32)
  Set newMenuItem = FileSubMenu.AddMenuItem(newMenu.count + 1, "Open", openMacro)

  ' Отобразим
  newMenu.InsertInMenuBar(ThisDrawing.Application.menuBar.count + 1)
End Sub

УДАЛЕНИЕ ПУНКТА ИЗ МЕНЮ

Sub DeleteMenuItem()
  Dim LastMenu As AcadPopupMenu
  Set LastMenu = ThisDrawing.Application.menuBar. _
              Item(ThisDrawing.Application.menuBar.count - 1)

  ' Добавим пункт меню
  Dim newMenuItem As AcadPopupMenuItem
  Dim openMacro As String
  openMacro = Chr(3) + Chr(3) + Chr(95) + "open" + Chr(32)
  Set newMenuItem = LastMenu.AddMenuItem(LastMenu.count + 1, "Open", openMacro)

  ' Удалим пункт меню
  newMenuItem.Delete
End Sub

ИССЛЕДОВАНИЕ СВОЙСТВ ПУНКТА МЕНЮ

Все пункты меню разделяют следующие свойства: Tag - уникальный идентификатор, Label - строка, определяющая содержание и форматирование, Caption - тот текст пункта меню, который видит пользователь, Macro - простой макрос или набор команд, Help String - быстрая подсказка в строке состояния, Enable - доступно или нет для выбора, Check - выбрано или нет, Index - номер пункта, начиная с нуля, Type - acMenuItem или acMenuSeparator или acSubMenu, Parent - меню к которому принадлежид данное меню. Пример включени отключения доступности:
Sub DisableMenuItem()
  Dim currMenuGroup As AcadMenuGroup
  Set currMenuGroup = ThisDrawing.Application.MenuGroups.Item(0)

  Dim newMenu As AcadPopupMenu
  Set newMenu = currMenuGroup.Menus.Add("TestMenu")

  ' Добавим два пункта и разделитель
  Dim MenuEnable As AcadPopupMenuItem
  Dim MenuDisable As AcadPopupMenuItem
  Dim MenuSeparator As AcadPopupMenuItem
  Dim openMacro As String

  ' Назначим макрос
  openMacro = Chr(3) + Chr(3) + Chr(95) + "open" + Chr(32)
  Set MenuEnable = newMenu.AddMenuItem(newMenu.count + 1, "OpenEnabled", openMacro)
  Set MenuSeparator = newMenu.AddSeparator("")
  Set MenuDisable = newMenu.AddMenuItem(newMenu.count + 1, "OpenDisabled", openMacro)

  ' Запретим второй пункт
  MenuDisable.Enable = False

  ' Отобразим
  newMenu.InsertInMenuBar(ThisDrawing.Application.menuBar.count + 1)
End Sub

СОЗДАНИЕ И РЕДАКТИРОВАНИЕ ПАНЕЛЕЙ ИНСТРУМЕНТОВ

Добавить кнопку на панель можно методом AddToolbarButton который принимает 5 параметров: Index, Name, HelpString, Macro, FlyoutButton (определяет будет ли панель выпадающая). Пример:
Sub AddButton()
  Dim currMenuGroup As AcadMenuGroup
  Set currMenuGroup = ThisDrawing.Application.MenuGroups.Item(0)

  ' Создаем сначала панель
  Dim newToolbar As AcadToolbar
  Set newToolbar = currMenuGroup.Toolbars.Add("TestToolbar")

  ' Добавляем кнопку
  Dim newButton As AcadToolbarItem
  Dim openMacro As String

  ' Назначим макрос
  openMacro = Chr(3) + Chr(3) + Chr(95) + "open" + Chr(32)
  Set newButton = newToolbar.AddToolbarButton("", "NewButton", "Open a file.", openMacro)
End Sub
Добавление разделителя используя метод AddSeparator.

НАЗНАЧЕНИЕ ЗНАЧКА ДЛЯ КНОПКИ

Для этого есть методы SetBitmap и GetBitmap, первый принимает два параметра SmallIconName (bmp-файл 15х16) и LargeIconName (bmp-файл 24х22). Пример опроса существующей панели на предмет наличия иконок у кнопок.
Sub GetButtonImages()
  Dim Button As AcadToolbarItem
  Dim Toolbar0 As AcadToolbar
  Dim MenuGroup0 As AcadMenuGroup
  Dim SmallButtonName As String,LargeButtonName As String
  Dim msg As String
  Dim ButtonType As String

  ' Первая панель в первой группе меню
  Set MenuGroup0 = ThisDrawing.Application.MenuGroups.Item(0)
  Set Toolbar0 = MenuGroup0.Toolbars.Item(0)

  SmallButtonName = "": LargeButtonName = ""

  msg = "Панель: " + Toolbar0.Name + vbCrLf
  Toolbar0.Visible = True

  ' Пройдем по коллекции, отображая имена иконок кнопок
  For Each Button In Toolbar0
      ButtonType = Choose(Button.Type + 1, "Button", "Separator", "Control", "Flyout")
      msg = msg & ButtonType & ":   "
      If Button.Type = acToolbarButton Or Button.Type = acToolbarFlyout Then
          Button.GetBitmaps SmallButtonName, LargeButtonName
          msg = msg + SmallButtonName + ", " + LargeButtonName
      End If
      msg = msg + vbCrLf
  Next Button

  MsgBox msg
End Sub

СОЗДАНИЕ ВЫПАДАЮЩЕЙ ПАНЕЛИ

Sub AddFlyoutButton()
  Dim currMenuGroup As AcadMenuGroup
  Set currMenuGroup = ThisDrawing.Application.MenuGroups.Item(0)

  ' Создадим панель
  Dim FirstToolbar As AcadToolbar
  Set FirstToolbar = currMenuGroup.Toolbars.Add("FirstToolbar")
  ' Добавим кнопку для выпадающей панели
  Dim FlyoutButton As AcadToolbarItem
  Set FlyoutButton = FirstToolbar.AddToolbarButton _
          ("", "Flyout", "Пример выпадающей панели","OPEN", True)

  ' Создадим вторую панель и привяжем ее к кнопе первой панели
  Dim SecondToolbar As AcadToolbar
  Set SecondToolbar = currMenuGroup.Toolbars.Add("SecondToolbar")

  ' Добавим кнопку на вторую панель
  Dim newButton As AcadToolbarItem
  Dim openMacro As String

  ' Назначим макрос
  openMacro = Chr(3) + Chr(3) + Chr(95) + "open" + Chr(32)
  Set newButton = SecondToolbar.AddToolbarButton _
          ("", "NewButton", "Open a file.", openMacro)

  ' Присоединим вторую панель к кнопке первой
  FlyoutButton.AttachToolbarToFlyout currMenuGroup.Name,SecondToolbar.Name

  ' Отобразим первую панель, скрыв вторую
  FirstToolbar.Visible = True
  SecondToolbar.Visible = False
End Sub

ПЛАВАЮЩАЯ И ПРИСТЫКОВАННАЯ ПАНЕЛИ

Чтобы сделать панель плавающей следует использовать метод Float, принимающий три параметра: top, left и NumberFloatRows. Для создания пристыкованной панели используйте метод Dock, принимающий три параметра: Side, Row, Column. Пример создания такой панели:
Sub DockToolbar()
  Dim currMenuGroup As AcadMenuGroup
  Set currMenuGroup = ThisDrawing.Application.MenuGroups.Item(0)

  ' Создадим панель
  Dim newToolbar As AcadToolbar
  Set newToolbar = currMenuGroup.Toolbars.Add("TestToolbar")

  ' Добавим кнопки с одним и тем же макросом для простоты
  Dim newButton1 As AcadToolbarItem
  Dim newButton2 As AcadToolbarItem
  Dim newButton3 As AcadToolbarItem
  Dim openMacro As String

  ' Назначим макрос
  openMacro = Chr(3) + Chr(3) + Chr(95) + "open" + Chr(32)

  Set newButton1 = newToolbar.AddToolbarButton("", "NewButton1", "Open a file.", openMacro)
  Set newButton2 = newToolbar.AddToolbarButton("", "NewButton2", "Open a file.", openMacro)
  Set newButton3 = newToolbar.AddToolbarButton("", "NewButton3", "Open a file.", openMacro)

  ' Отобразим панель
  newToolbar.Visible = True

  ' Пристыкуем к левому краю экрана
  newToolbar.Dock acToolbarDockLeft
End Sub
Для удаления кнопки из панели используется метод Remove когда панель инструментов видима.

СВОЙСТВА ЭЛЕМЕНТОВ ПАНЕЛИ ИНСТРУМЕНТОВ

Tag, Name, Macro, HelpString, Index, Type (acButton, acToolButtonSeparator, acControl), Flyout, Parent, и другие - задающие пристыковку, видимость и т.д.

СОЗДАНИЕ МАКРОСОВ

Макросы представляют собой серию команд, выполняющих определенные действия. Если команда вызываемая макросом принимает параметры, то нужно знать в какой последовательности. Каждый символ имеет значение и даже пробел. Последовательность параметров может меняться от верисии к версии Автокада. Когда команда вводится из пункта меню, значения системных переменных PICKADD и PICKAUTO равны 1 и 0 соответственно для совместимости с предыдущими версиями Автокад.

ТАБЛИЦА СООТВЕТСТВИЯ КОМБИНАЦИЯ КЛАВИШ ASCII-СИМВОЛАМ

СимволASCII-эквивалентОписание
;chr(59)Enter
^Mchr(97)+chr(77)Enter
^Ichr(94) + chr(124)TAB
пробелchr(32)пробел
\chr(92)Ожидание ввода от пользователя
-chr(95)Перевод команд и ключевых слов
+chr(43)Продолжение макроса на другой строке
=*chr(61) + chr(42)Отображает меню
*^C^Cchr(42)+chr(94)+chr(67)+chr(94)+chr(67)Повторять команду
$chr(36)Загрузка секции меню или начало DIESEL-выражения
^Bchr(94)+chr(66)Включить-выключить привязку
^Cchr(94)+chr(67)Отмена команды
ESCchr(3)Отмена команды
^Dchr(94)+chr(68)Включить-выключить координаты
^Echr(94)+chr(69)Установить следующую изометрическую плоскость
^Gchr(94)+chr(71)Включить-выключить сетку
^Hchr(94)+chr(72)BackSpace
^Ochr(94)+chr(79)Включить-выключить Орто
^Pchr(94)+chr(80)Включить-выключить MENUECHO
^Qchr(94)+chr(81)Эхо на принтер
^Tchr(94)+chr(84)Включить-выключить Tablet
^Vchr(94)+chr(86)Сменить видовой экран
^Zchr(94)+chr(90)Подавить автоматическое добавление пробела в конце

При выполнении макросов Автокад помещает пробел в конец, перед выполнением последовательности команд. Когда это не желательно (например для команд TEXT или DIM) команда может завершаться Enter, а не пробелом. Также иногда требуется более одного пробела или Enter, но некторые текстовые редакторы не позволяют создавать строки с концевыми пробелами. Для избежания этой проблемы используются два специальных соглашения: когда в макросе встречается точка с запятой Автокад заменяет ее на Enter, если строка заканчивается управляющим символом (обратный слэш, плюс или точкаСзапятой) Автокад не добавляет пробел. Обратный слэш вызывает ввод параметров команды пользователем, и обычно после ввода одного параметра продолжается выполнение макроса. Значит невозможно создать макрос принимающий переменное число параметров и продолжающего выполнение (как например при выборе объектов). Одно исключение сделано для команды SELECT. Например следующий макрос
select \change previous ;properties color red ;
позволяет выбрать несколько объектов, затем вызывается команда Change с опцией Previos и меняться цвет у выбранных объектов. Так как обратный слэш используется для ожидания ввода, его нельзя использовать для других действий, поэтому при указании пути к файлу в качестве разделителя используется прямой слэш. Следующие обстоятельства задерживают выполнение макроса:

Перед началом выполнения макроса рекомендуется использовать последовательность ^C^C, чтобы отменить выполнение предыдущей команды. Для выполнения макроса в цикле используется *^C^C (при этом в самом макросе уже нельзя использовать ^C, т.к. это приведет к его прерыванию). Пример: *^C^CMOVE Single.

ДОБАВЛЕНИЕ ПУНКТОВ ВО ВСПЛЫВАЮЩЕЕ МЕНЮ

Такие меню появляются когда пользователь нажимает правую кнопку мыши, удерживая при этом Shift. Автокад ищет высплывающее меню в группе меню по установленному значению свойства ShortcutMenu=TRUE. Добавление пункта во всплывающее меню
Sub AddMenuItemToshortcutMenu()
  Dim currMenuGroup As AcadMenuGroup
  Set currMenuGroup = ThisDrawing.Application.MenuGroups.Item(0)
  
  ' ищем всплывающее меню и назначаем ему переменную
  Dim scMenu As AcadPopupMenu
  Dim entry As AcadPopupMenu
  For Each entry In currMenuGroup.Menus
      If entry.shortcutMenu = True Then
          Set scMenu = entry
      End If
  Next entry
      
  ' добавим новый пункт меню
  Dim newMenuItem As AcadPopupMenuItem
  Dim openMacro As String
  openMacro = Chr(3) + Chr(3) + Chr(95) + "open" + Chr(32)
  
  Set newMenuItem = scMenu.AddMenuItem ("", Chr(Asc("&")) + "OpenDWG", openMacro)
End Sub
Читать дальше - В начало - На главную