Элементы управления. Компоненты меню
В конструкторе компонента содержимого мы вызываем наш метод 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.
Дополнительные материал
Архив с исходными текстами примеровВы можете скачать здесь