Россия |
Элементы управления. Компоненты меню
Класс ApplicationCommandTarget включает 4 чистые виртуальные функции, которые мы переопределим в нашем классе ( пример 15.8
- Virtual ApplicationCommandTarget* ApplicationCommandTarget::getNextCommandTarget() - возвращает следующий после текущего приёмник команд;
- virtual void ApplicationCommandTarget::getAllCommands(Array< CommandID >& commands) — возвращает список всех команд, которые могут быть обработаны;
- virtual void ApplicationCommandTarget::(CommandID commandID, ApplicationCommandInfo& result) — предоставляет всю необходимую информацию по обрабатываемой команде; не считая идентификатора команды, которым является первый параметр метода, эта информация содержится в объекте ApplicationCommandInfo, который предварительно должен быть создан и инициализирован;
- virtual bool ApplicationCommandTarget::perform(const InvocationInfo& info) — запускает команду на выполнение, получая всю необходимую информацию о ней из объекта InvocationInfo, конструктор которого в качестве параметра принимает идентификатор команды. Если все обработчики команд меню находятся в этой функции, то ранее рассмотренный метод menuItemSelected следует оставить пустым.
#ifndef _TCentralComponent_h_ #define _TCentralComponent_h_ //------------------------------------------------ #include "../JuceLibraryCode/JuceHeader.h" #include "TMainForm.h" //------------------------------------------------ // Класс компонента содержимого. // Наследует класс приёмника команд class TCentralComponent : public Component, public MenuBarModel, public ApplicationCommandTarget { public: TCentralComponent(TMainForm* pParent); ~TCentralComponent(); // Идентификаторы команд меню enum TMenuOptions { FileNew = 1, FileOpen = 2, FileQuit = 3, LanguageEnglish = 4, LanguageRussian = 5 }; void paint(Graphics&); void resized(); void mouseDown(const MouseEvent&); const StringArray getMenuBarNames(); void menuItemSelected(int, int); const PopupMenu getMenuForIndex(int, const String&); // Функции, наследуемые от ApplicationCommandTarget // Возвращает следующий после текущего приёмник команд ApplicationCommandTarget* getNextCommandTarget(); // Возвращает список всех команд, которые могут быть обработаны void getAllCommands(Array<int>&); // Предоставляет всю необходимую информацию по обрабатываемой команде void getCommandInfo(CommandID, ApplicationCommandInfo&); // Запускает команду на выполнение bool perform(const InvocationInfo&); // Обработчик смены команд интерфейса void LanguageChange(); private: // Флаги, какой язык выбран bool bEnglish; bool bRussian; // Родительский компонент TMainForm* pParent; // Ярлык для вывода сообщений Label* pMessagesLabel; // Строки интерфейса String sMessagesLabelText; String sFileMenuText; String sLanguageMenuText; String sFileNewMenuText; String sFileOpenMenuText; String sFileQuitText; String sMessageTitleText; String sMessageNewText; String sMessageOpenText; String sYesButtonText; Image ImageNew_png; Image ImageOpen_png; Image ImageExit_png; // Предотвращает создание копии конструктора и оператора = TCentralComponent(const TCentralComponent&); const TCentralComponent& operator= (const TCentralComponent&); }; //--------------------------------------------------- #endifЛистинг 15.8. Объявление класса компонента содержимого TCentralComponent (файл TCentralComponent.h
Как видно из листинга 15.8 , в нашем новом приложении в список идентификаторов команд меню мы добавили две новые: LanguageEnglish и LanguageRussian. Именно эти команды будут обрабатываться с помощью методов ApplicationCommanTarget, а остальные — ранее описанным способом.
Кроме того, мы предусмотрели метод void TCentralComponent::LanguageChange(), в котором собственно и будет осуществляться смена языка интерфейса, а также ряд строковых переменных, которые и будут храниться перевод интерфейса, и две булевых, которые будут выступать в качестве флагов того, какой из языков включён в данный момент ( пример 15.8).
Следует понимать, что подобный способ перевода интерфейса, хотя и работает, но приведён исключительно как пример использования командного менеджера. Локализацию приложений, написанных на основе Juce, удобнее осуществлять с помощью класса LocalisedStrings, описание которого дано в "Глоссарий" .
Основным отличием реализации конструктора нашего приложение является то, что мы запоминаем указатель на окно главного приложения. Это необходимо для того, чтобы иметь возможность доступа к его командному менеджеру ( пример 15.7, пример 15.9).
#include "TCentralComponent.h" #include"TImagesFactory.h" //------------------------------------------------------- #define tr(s) String::fromUTF8(s) //------------------------------------------------------- TCentralComponent::TCentralComponent(TMainForm* pParent) : Component("Central Component"), pMessagesLabel(0) { this->pParent = pParent; pMessagesLabel = new Label(L"Messages Label", ""); pMessagesLabel->setFont(Font(15.0000f, Font::plain)); pMessagesLabel->setJustificationType(Justification::centred); pMessagesLabel->setEditable (false, false, false); pMessagesLabel->setColour(Label::outlineColourId, Colours::black); pMessagesLabel->setColour(Label::textColourId, Colours::black); pMessagesLabel->setColour(Label::backgroundColourId, Colours::azure); addAndMakeVisible(pMessagesLabel); ImageExit_png = ImageCache::getFromMemory(TImagesFactory::psExit_png, TImagesFactory::iExit_pngSize); ImageNew_png = ImageCache::getFromMemory(TImagesFactory::psNew_png, TImagesFactory::iNew_pngSize); ImageOpen_png = ImageCache::getFromMemory(TImagesFactory::psOpen_png, TImagesFactory::iOpen_pngSize); setSize (700, 400); bEnglish = true; bRussian = false; LanguageChange(); } //----------------------------------------------------- TCentralComponent::~TCentralComponent() { // Удаляем дочерние виджеты // и обнуляем их указатели deleteAllChildren(); } //----------------------------------------------------- void TCentralComponent::LanguageChange() { if(bEnglish) { sMessagesLabelText = tr( quot;Choose an option of the main menu \nor right-click outside of the label to invoke a context menu."); sFileMenuText = tr("File"); sLanguageMenuText = tr("Language"); sFileNewMenuText = tr("New"); sFileOpenMenuText = tr("Open"); sFileQuitText = tr("Quit"); sMessageTitleText = tr("Information"); sMessageNewText = tr("Option \"New\" was selected"); sMessageOpenText = tr("Option \"Open\" was selected"); sYesButtonText = tr("Yes"); } else if(bRussian) { sMessagesLabelText = tr( "Выберите пункт главного меню \nили щёлкните правой кнопкой мыши за пределами надписи для того, чтобы вызвать контекстное меню."); sFileMenuText = tr("Файл"); sLanguageMenuText = tr("Язык"); sFileNewMenuText = tr("Новый"); sFileOpenMenuText = tr("Открыть"); sFileQuitText = tr("Выход"); sMessageTitleText = tr("Информация"); sMessageNewText = tr("Выбран пункт \"Новый\""); sMessageOpenText = tr("Выбран пункт \"Открыть\""); sYesButtonText = tr("Да"); } pMessagesLabel->setText(sMessagesLabelText, false); getMenuBarNames(); // Перерисовываем пункты меню с учётом нового языка menuItemsChanged(); } //--------------------------------------------------Листинг 15.9. Реализация конструктора и метода LanguageChange класса компонента содержимого TCentralComponent (файл TCentralComponent.cpp)