Опубликован: 13.07.2012 | Доступ: свободный | Студентов: 460 / 9 | Оценка: 5.00 / 5.00 | Длительность: 18:06:00
Специальности: Программист
Лекция 15:

Элементы управления. Компоненты меню

< Лекция 14 || Лекция 15: 12345 || Лекция 16 >

Метод 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)
< Лекция 14 || Лекция 15: 12345 || Лекция 16 >