Элементы управления. Компоненты меню
Цель лекции: Научиться создавать и использовать главное и контекстное меню в своих программах
Непременным атрибутом современного профессионально выглядящего приложения является меню. Оно представляет собой ограниченную область с набором пунктов, выбирая которые, пользователь вызывает определённые команды приложения. Каждой команде присваивается уникальный идентификационный номер, по которому к ней можно обращаться однозначно.
Основными типами меню являются:
- меню верхнего уровня, представляющее собой полосу с набором команд в верхней части главного окна программы и
- контекстное меню, представляющее собой прямоугольную область с рядом пунктов (обычно вертикально расположенных), вызываемое щелчком правой кнопкой мыши по тому или иному виджету.
Меню верхнего уровня является результатом совместной работы нескольких классов компонентов: MenuBarComponent, который создаёт полосу под заголовком окна и отвечает за отображение команд, которые (вместе с их обработчиками) создаёт MenuBarModel, а также PopupMenu, объекты которого образуют выпадающие меню и подменю.
Класс PopupMenu создаёт также и контекстное меню.
Конструктор MenuBarComponent в качестве параметра принимает указатель на объект MenuBarModel: MenuBarComponent::MenuBarComponent(MenuBarModel* model). В случае, если мы создаём меню главного окна приложения (а на практике именно так и происходит), то удобнее воспользоваться методом класса DocumentWindow void DocumentWindow::setMenuBar(MenuBarModel* menuBarModel, int menuBarHeight = 0), который также принимает в качестве параметра указатель на объект MenuBarModel, который и формирует внешний вид меню. Второй принимаемый параметр — это ширина меню; в случае, если он принимает значение 0, то ширина полосы меню будет установлена по умолчанию.
Если функция setMenuBar принимает нулевое значение, любое существующее меню будет удалено из главного окна и тогда мы можем добавить объект MenuBarComponent с помощью метода void DocumentWindow::setMenuBarComponent(Component* newMenuBarComponent). Получить текущее меню можно с помощью функции-члена класса DocumentWindow Component* DocumentWindow::getMenuBarComponent() const.
Рассмотрим создание меню верхнего уровня и контекстного меню на примере простого приложения ( рис. 15.1).
Для начала создадим основу нашего меню — её модель. Пусть наши меню, как верхнего уровня, так и контекстное, включают три команды: "Новый", "Открыть" и "Выход". При этом реально работать (осуществлять выход из программы) будет только последняя; при щелчке по первым двум будет выводиться информационное сообщение.
В качестве модели меню будет выступать класс компонента содержимого, который мы унаследуем от класса MenuBarModel ( пример 15.1).
#ifndef _TCentralComponent_h_ #define _TCentralComponent_h_ //------------------------------------------ #include "../JuceLibraryCode/JuceHeader.h" //------------------------------------------ // Класс компонента содержимого. // Наследует класс модели меню class TCentralComponent : public Component, public MenuBarModel { public: TCentralComponent(); ~TCentralComponent(); // Идентификаторы команд меню enum TMenuOptions { FileNew = 1, FileOpen = 2, FileQuit = 3 }; void paint(Graphics&); void resized(); // Функции, наследуемые от MenuBarModel const StringArray getMenuBarNames(); void menuItemSelected(int, int); const PopupMenu getMenuForIndex(int, const String&); // Вызывает контекстное меню void mouseDown(const MouseEvent&); private: // Ярлык для вывода сообщений Label* pMessagesLabel; // Изображения - пиктограммы меню Image ImageNew_png; Image ImageOpen_png; Image ImageExit_png; // Предотвращает создание копии конструктора и оператора = TCentralComponent(const TCentralComponent&); const TCentralComponent& operator= (const TCentralComponent&); }; //--------------------------------------------- #endifЛистинг 15.1. Объявление класса компонента содержимого TCentralComponent (файл TCentralComponent.h)
Класс MenuBarModel включает три чистые виртуальные функции (см. пример 15.1), которые должны быть переопределены в классе компонента содержимого.
Метод virtual const StringArray MenuBarModel::getMenuBarNames() возвращает список основных пунктов меню, отображаемых на её полосе. В наше программе это только один — пункт "Файл" (рисунок 15.1 , пример 15.2).
const StringArray TCentralComponent::getMenuBarNames() { // Создаются основные пункты меню StringArray sMenuNames; sMenuNames.add(tr("Файл")); return sMenuNames; }Листинг 15.2. Реализация метода getMenuBarNames класса компонента содержимого TCentralComponent (файл TCentralComponent.cpp)