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

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

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

В конструкторе компонента содержимого мы вызываем наш метод LanguageChange для задания строк интерфейса приложения. Также эта функция будет вызываться всякий раз, когда пользователь выбирает новый пункт в меню "Язык". Флагом выбора того или иного языка выступают булевые переменные bEnglish и bRussian. Для того, чтобы принудительно перерисовать пункты меню, исходя из новых языковых настроек, мы вызываем метод void MenuBarModel::menuItemsChanged().

Рассмотрим реализацию функций, унаследованных от класса ApplicationCommandTarget. Метод getNextCommandTarget просто возвращает первый родительский компонент в иерархии классов программы, наследующий класс ApplicationCommandTarget. Для этого используется метод ApplicationCommandTarget* ApplicationCommandTarget::findFirstTargetParentComponent() ( пример 15.10).

ApplicationCommandTarget* TCentralComponent::getNextCommandTarget()
{getAllCommands
    return findFirstTargetParentComponent();
}
Листинг 15.10. Реализация метода getNextCommandTarget класса компонента содержимого TCentralComponent (файл TCentralComponent.cpp)

Метод getAllCommands собственно и производит регистрацию ранее созданных идентификаторов команд ( пример 15.8, пример 15.11)

void TCentralComponent::getAllCommands(Array<int>& iCommands)
{
  // Регистрация команд для командного менеджера
  const CommandID IDs[] =
  {
    LanguageEnglish,
    LanguageRussian
  };
  
  iCommands.addArray(IDs, numElementsInArray(IDs));
}
Листинг 15.11. Реализация метода getAllCommands класса компонента содержимого TCentralComponent (файл TCentralComponent.cpp)

Метод getCommandInfo задаёт основные свойства команд меню, исходя из их идентификаторов ( пример 15.12).

void TCentralComponent::getCommandInfo(CommandID ID, ApplicationCommandInfo& 
            Result)
{
  switch(ID)
  {
    case LanguageEnglish:
    {
      Result.setInfo(L"English", L"Switch to English", "Language", 0);
      Result.setTicked(bEnglish);
      break;
    }
    case LanguageRussian:
    {
      Result.setInfo(tr("Русский"), L"Switch to Russian", "Language", 0);
      Result.setTicked(bRussian);
      break;
    }
  }
}
Листинг 15.12. Реализация метода getCommandInfo класса компонента содержимого TCentralComponent (файл TCentralComponent.cpp)

Как мы уже упоминали, за это отвечает объект класса ApplicationCommandInfo. Отображение соответствующих команде пунктов меню в программе мы задаём вызовом метода void ApplicationCommandInfo::setInfo(const String& shortName, const String& description, const String& categoryName, int flags), который принимает следующие параметры:

  • shortName — краткое название пункта меню;
  • description — его описание;
  • categoryName — категория;
  • flags — флаги.

Флагами являются идентификаторы перечислимого типа enum ApplicationCommandInfo::CommandFlags:

  • isDisabled — пункт меню недоступен для выбора пользователем;
  • isTicked — рядом с пунктом стоит галочка;
  • wantsKeyUpDownCallbacks — команда вызывается дважды;
  • hiddenFromKeyEditor — делает команду недоступной для включения в список команд объекта класса KeyMappingEditorComponent (хранит карту клавиатурных комбинаций);
  • readOnlyInKeyEditor — делает команду доступной для включения в список команд объекта класса KeyMappingEditorComponent (хранит карту клавиатурных комбинаций), но не позволяет менять ассоциированную клавиатурную комбинацию;
  • dontTriggerVisualFeedback — если команда была вызвана с помощью клавиатурной комбинации, пункты меню на это не реагируют.

В нашем примере параметр flags принимает значение 0, поскольку мы устанавливаем поведение пунктов меню с помощью метода void ApplicationCommandInfo::setTicked(bool isTicked) throw(), который снимает или устанавливает флаг isTicked в зависимости от принимаемого параметра ( пример 15.12). Аналогично функция void ApplicationCommandInfo::setActive(bool isActive) throw() может делать пункт меню активным или неактивным, устанавливая или сбрасывая флаг isDisabled.

И наконец, рассмотрим метод perform, где мы поместили обработчики команд смены языка интерфейса ( пример 15.13). Их работа понятна из комментариев.

bool TCentralComponent::perform(const InvocationInfo& Info)
{
  switch(Info.commandID)
  {
    case LanguageEnglish:
    {
      // Отмечаем пункт меню - английский
      bEnglish = true;
      bRussian = false;
      break;
    }
    case LanguageRussian:
    {
      // Отмечаем пункт меню - русский
      bEnglish = false;
      bRussian = true;
      break;
    }
  }
  
  // Меняем язык интерфейса
  LanguageChange();

  return true;
}
Листинг 15.13. Реализация метода peform класса компонента содержимого TCentralComponent (файл TCentralComponent.cpp)

Краткие итоги

Для создания меню верхнего уровня вашего приложения необходимо описать набор команд и связать его с соответствующими в модели меню (MenuBarModel). За отображение пунктов меню и выпадающих меню отвечает класс MenuBarComponent. Как выпадающее, так и контекстное меню создаётся объектами класса PopupMenu.

Дополнительные материал

Архив с исходными текстами примеровВы можете скачать здесь

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