| Россия |
Элементы управления. Компоненты меню
Метод 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)