Элементы управления. Компоненты меню
Метод virtual void MenuBarModel::menuItemSelected(int menuItemID, int topLevelMenuIndex) вызывается всякий раз, когда пользователь щёлкает по тому или иному пункту меню. Идентификатор команды, вызываемой пользователем, и является первым параметром функции. Второй параметр — идентификатор того меню верхнего уровня, в котором была выбрана команда menuItemID.
Именно в этом методе и находятся обработчики команд меню, выбираемых по их числовым идентификаторам ( пример 15.3).
void TCentralComponent::menuItemSelected(int iMenuItemID, int iTopLevelMenuIndex) { // Обработчики команд меню switch(iMenuItemID) { // Если выбран пункт "Выход"... case FileQuit: { // Завершаем работу программы JUCEApplication::quit(); break; } // Если выбран пункт "Новый"... case FileNew: { // показываем сообщение AlertWindow::showMessageBox(AlertWindow::InfoIcon, tr("Информация"), tr("Выбран пункт \"Новый\""), tr("Да"), 0); break; } // Если выбран пункт "Открыть"... case FileOpen: { // показываем сообщение AlertWindow::showMessageBox(AlertWindow::InfoIcon, tr("Информация"), tr("Выбран пункт \"Открыть\""), tr("Да"), 0); break; } } }Листинг 15.3. Реализация метода menuItemSelected класса компонента содержимого TCentralComponent (файл TCentralComponent.cpp)
Метод virtual const PopupMenu MenuBarModel::getMenuForIndex(int topLevelMenuIndex, const String& menuName) создаёт выпадающее меню для каждого пункта topLevelMenuIndex. Второй параметр метода — отображаемое имя соответствующего пункта меню ( пример 15.4).
const PopupMenu TCentralComponent::getMenuForIndex(int iIndex, const String& sMenuName) { // Создаём выпадающее меню PopupMenu Menu; switch(iIndex) { // Индекс 0 соответствует пункту меню "Файл" // (см. getMenuBarNames) case 0: { // Добавляем новые пункты в меню "Файл" Menu.addItem(FileNew, tr("Новый"), true, false, ImageNew_png); Menu.addItem(FileOpen, tr("Открыть"), true, false, ImageOpen_png); // Добавляем разделитель Menu.addSeparator(); Menu.addItem(FileQuit, tr("Выход"), true, false, ImageExit_png); break; } } return Menu; }Листинг 15.4. Реализация метода getMenuForIndex класса компонента содержимого TCentralComponent (файл TCentralComponent.cpp)
Для добавления новых пунктов в выпадающее меню мы воспользовались методом void PopupMenu::addItem(int itemResultId, const String & itemText, bool isEnabled = true, bool isTicked = false const Image & iconToUse = Image::null) , класса PopupMenu. Метод принимает следующие параметры:
- itemResultId — число, возвращаемое методом show класса PopupMenu, когда пользователь выбирает пункт меню; как понятно, в качестве этого параметра передаётся идентификатор соответствующей команды;
- itemText — текст пункта меню для отображения;
- isEnabled — если параметр принимает значение true, пункт меню окрашивается в серый цвет и не может быть выбран;
- isTicked — если параметр принимает значение true, рядом с пунктом меню отображается галочка;
- iconToUse — если параметр не равен нулю, с левой стороны пункта меню отображается пиктограмма (icon).
Для того, чтобы удалить все пункты из меню, необходимо вызвать метод void PopupMenu::clear().
Практически также создаётся контекстное меню. Для его отображения нам необходимо переопределить функцию — обработчик события нажатия пользователем кнопки мыши ( пример 15.5).
void TCentralComponent::mouseDown(const MouseEvent& Event) { // Если пользователь пытается вызвать контекстное меню... if(Event.mods.isPopupMenu()) { // создаём его... PopupMenu LabelPopupMenu; // и добавляем в него пункты LabelPopupMenu.addItem(FileNew, tr("Новый"), true, false, ImageNew_png); LabelPopupMenu.addItem(FileOpen, tr("Открыть"), true, false, ImageOpen_png); LabelPopupMenu.addSeparator(); LabelPopupMenu.addItem(FileQuit, tr("Выход"), true, false, ImageExit_png); // Показываем контекстное меню. const int iResult = LabelPopupMenu.show(); // В зависимости от идентификатора команды // вызываем тот или иной обработчик. if(iResult == FileNew) { AlertWindow::showMessageBox(AlertWindow::InfoIcon, tr("Информация"), tr("Выбран пункт \"Новый\""), tr("Да"), 0); } else if(iResult == FileOpen) { AlertWindow::showMessageBox(AlertWindow::InfoIcon, tr("Информация"), tr("Выбран пункт \"Открыть\""), tr("Да"), 0); } else if(iResult == FileQuit) { JUCEApplication::quit(); } } }Листинг 15.5. Реализация метода mouseDown класса компонента содержимого TCentralComponent (файл TCentralComponent.cpp)