Опубликован: 13.07.2012 | Уровень: специалист | Доступ: платный
Лекция 15:

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

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

Класс 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)
< Лекция 14 || Лекция 15: 12345 || Лекция 16 >
Иван Иванов
Иван Иванов
Россия
Александр Тырин
Александр Тырин
Россия