В предыдущей статье мы обсудили, как использовать новый .NET API из MapBasic для интеграции ваших MapBasic-приложений в новый ленточный интерфейс 64-битной MapInfo Pro 12.5.
В этой статье я покажу, как некоторые базовые задачи могут быть решены проще с использованием библиотеки MapBasic, представляющей собой "обёртку" вокруг .NET API в виде ряда простых для использования пользовательских функций и процедур MapBasic. Я намеренно написал “базовые задачи”, потому что в данное время библиотека Ribbon не позволяет модифицировать некоторые части нового ленточного интерфейса. Под “базовыми задачами” я подразумеваю создание или удаление вкладок, групп и основных элементов управления, типа кнопок, кнопок инструментов и разворачивающихся кнопок. Вы также сможете добавлять или удалять кнопки из разворачивающихся кнопок.
MapBasic 12.5.1
Для начала вам необходимо загрузить и установить MapBasic 12.5.1 с сайта http://mapinfo.ru/product/mapinfo-mapbasic#estimap-tab-128. Вам необходима эта новая версия MapBasic для компиляции MapBasic-приложений, которые могут модифицировать новый ленточный интерфейс. Вы можете установить MapBasic 12.5.1 совместно с MapBasic 12.5 или другими старыми версиями MapBasic. Также обратите внимание, что для выполнения скомпилированных MapBasic приложений потребуется как минимум MapInfo Pro 12.5.1.
Что такое RibbonLib?
Библиотека Ribbon это модуль MapBasic, .mb файл, содержащий ряд пользовательских функций и процедур MapBasic, которые помогут программистам на MapBasic интегрировать их существующие и вновь создаваемые приложения в новый ленточный интерфейс 64-битной MapInfo Pro.
Билиотека Ribbon это "обёртка" вокруг .NET API, представляющая ряд функций, позволяющих добавить новые элементы управления на ленту, используя вызовы нескольких функций MapBasic.
Для того чтобы использовать функции из библиотеки Ribbon в своём модуле MapBasic, необходимо включить объявление функций и процедур библиотеки в модуле. Вы можете сделать это, используя ключевое слово “include”.
Библиотека Ribbon содержит ряд других пользовательских библиотек, которые используются библиотекой Ribbon и приложением Ribbon Example. Объявления для них также были включены в приложение Ribbon Example, как показано ниже. Объявление библиотеки Ribbon подсвечено синим.
Когда в коде вы используете функции и процедуры, которые находятся вне исходного файла, файлы будут скомпилированы в файлы .mbo, а не в .mbx файлы. После этого вам потребуется сделать сборку файлов mbo в финальный mbx файл, используя файл проекта MapBasic - mbp.
Файл MapBasic проекта для приложения Ribbon Example выглядит так:
Загрузите и посмотрите на пример приложения Ribbon Example, чтобы получить представление о том, как вы можете структурировать проект MapBasic, использующий несколько модулей.
Работа с вкладками
Давайте начнём с первого элемента ленты - вкладки.
RibbonLib позволяет проанализировать существующие вкладки и добавить новые вкладки на ленту. В коде ниже вы можете увидеть, что я сначала проверяю, существует ли определённая вкладка, используя функцию RBNTabExists. Если она не существует я добавляю её на ленту, используя функцию RBNAddTab.
nCtrlIdx теперь содержит ссылку на внутренний ID вкладки в RibbonLib. Вы можете использовать этот ID для работы с вашей вкладкой, используя функции библиотеки RibbonLib, для которых требуется значение индекса для вкладки.
Работа с группами
Теперь я могу добавить группы к этой новой вкладке или любой другой существующей на ленте вкладке.
Я снова начинаю с проверки существования группы. Если группа не существует, я использую функцию RBNTabAddGroup, чтобы добавить её на вкладку. Здесь я использую то же имя и заголовок для группы – константу с именем xProgramMenu, определённую в коде ранее.
Работа с кнопками - добавление
Ну и наконец, добавляем кнопки, которые пользователь будет использовать для взаимодействия с вашим приложением.
Вы можете добавить кнопку, которая будет сравнима с пунктом меню в классическом интерфейсе, основанном на меню. Или вы можете использовать другие типы элементов управления, такие как ToolButton, RibbonSeparator или SplitButton.
В первом примере я добавляю кнопку к новой группе, которую я создал на новой вкладке TOOLS, используя функцию RBNGroupAddButton. Обратите внимание, что сначала я добавляю кнопку, а затем использую индекс кнопки, чтобы указать её подсказку (tooltip), иконки (icons) и обработчик, который она вызывает, когда пользователь активирует её.
Функция RBNControlSetToolTipIdx принимает ряд параметров. Первый - это индекс элемента управления, чтобы задать подсказку (tooltip), затем заголовок подсказки и, наконец, собственно сама подсказка, и, возможно также, подсказка, которая будет показана, если инструмент был отключён.
Функция RBNControlSetIconsIdx также принимает индекс элементов управления. Кроме этого, необходимо знать размеры иконок для элемента управления и имена иконок. Иконки могут храниться либо как физические файлы на диске, например, в подкаталоге приложения, либо они могут быть сохранены в сборке .NET как ресурсы и доступны как пакет.
Используя примеры, приведённые выше, вы можете создать свои вкладки, добавить группу к этой вкладке, а затем добавить одну или более кнопок в эту группу. В MapInfo Pro результат может выглядеть следующим образом:
Работа с кнопками - вставка
В следующем примере покажем, как вставить кнопку перед существующим элементом управления на ленте. Это полезно, если вы хотите поместить ваш элемент управления рядом с существующим элементом со сходным поведением или функциональностью.
Функция RBNGroupInsertButtonBefore принимает на один параметр больше, чем предыдущая функция RBNGroupAddButton - имя элемента управления, перед которым будет помещаться новая кнопка. Если указанное имя элемента управления не будет найдено, новый элемент будет добавлен в группу последним.
Здесь вы можете видеть новый элемент - Browser Info, вставленный перед кнопкой Export.
Работа с разворачивающимися кнопками (splitbuttons)
В последнем примере я покажу как добавить элемент управления к существующей разворачивающейся кнопке (SplitButton). Разворачивающаяся кнопка (SplitButton) - это элемент управления, который может содержать несколько других элементов управления. Она позволяет вам сгруппировать элементы управления со схожей функциональностью в одном "раскрывающемся" элементе управления.
Функция RBNSplitButtonGroupAddControl работает подобно вышеупомянутым функциям. Только для того, чтобы добавить новый элемент управления, помимо Tab и Group Name требуются дополнительные параметры: имя SplitButton и имя MenuGroup на SplitButton.
На снимке экрана ниже показан новый элемент управления - кнопка, добавленная к другим инструментам выбора в существующей разворачивающейся кнопке.
Подписка на события
Новый .NET API также позволяет вам подписаться на ряд новых событий. Раньше в MapBasic поддерживалось только несколько основных событий, на которые вы могли реагировать, типа SelChangedHandler, WinChangedHandler и WinClosedHandler.
В новом .NET API мы начали расширять список событий. Чтобы воспользоваться этими новыми событиями, необходимо установить подписку на эти события.
Бибиотека RibbonLib помогает вам сделать это просто, используя пользовательскую MapBasic функцию RBNEventSubscribe. Эта функция принимает два параметра: событие, на которое вы хотите подписаться, и процедура MapBasic, которая должна быть вызвана, когда событие произойдёт.
Ниже вы видете два примера, где я подписываюсь на два новых события TableOpened и TableClosed.
Здесь вы можете видеть процедуру, которая будет вызываться, когда произойдёт событие TableClosed.
Обратите внимание, что процедура принимает параметр This, который является ссылкой на атрибуты события. Вы можете использовать ряд функций, объявленных в IMapInfoPro.def, чтобы получить атрибуты. В примере выше я использую GetTableEventsArgsTableAlias, чтобы получить имя таблицы, которая была закрыта.
Какие именно функции вы можете использовать, зависит от типа события.
Удаление пользовательских элементов управления при выходе
Если вы уже создавали приложения на MapBasic, использующие классический, основанный на меню интерфейс, то вы знаете, что нет необходимости что-то "подчищать" после себя при выгрузке приложения MapBasic. MapInfo Pro сделает это за вас.
Теперь ситуация изменилась. Вашему приложению необходимо удалить вкладки, группы и элементы управления которые вы добавили на ленту. Если для добавления элементов управления на ленточный интерфейс вы использовали функции из библиотеки RibbonLib, вы можете сделать эту "чистку", используя единственную процедуру из RibbonLib: RBNEndHandler.
RibbonLib отслеживает, где и какие элементы управления вы добавили, и позволяет удалить их.
В приложении вам всего лишь необходимо добавить вызов RBNEndHandler, в процедуре EndHandler и RibbonLib удалит элементы управления, которые были добавлены.
Где взять RibbonLib?
Мы разместили RibbonLib на нашей страничке загрузки: http://communitydownloads.pbinsight.com/code-exchange/download/ribbon-library-for-mapbasic
Перейдите на сайт и загрузите zip файл. Там же можно поставить рейтинг приложению, если хотите.
Мы также сделали доступным исходный код для RibbonLib, или точнее, для приложения RibbonExample через Github. Это простой способ получить исходный код и последнюю версию программы.
Вы можете взять исходный код приложения RibbonExample здесь, на Github: https://github.com/PeterHorsbollMoller/mbRibbonExample
Итоги
В этой статье я показал, как программисты на MapBasic могут легко изменить интерфейс 64-битной MapInfo Pro 12.5.1, используя библиотеку Ribbon.
Мы посмотрели, как добавить вкладку, группу и ряд других типов элементов управления.
Мы посмотрели, как, используя RibbonLib, легко удалить пользовательские элементы управления, добавленные вашим MapBasic-приложением, когда оно закрывается.
И мы кратко посмотрели, как подписаться на новые события, добавленные в новом .NET API.
Автор Peter Horsbøll Møller, MapInfo, GIS & Location Intelligence Specialist