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

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

< Лекция 13 || Лекция 14: 123 || Лекция 15 >

Рассмотрим реализацию нашего класса пример 14.2. В большей своей части она состоит из реализации вышеупомянутых чистых виртуальных функций getAllToolbarItemIds, getDefaultItemSet и createItem.

#include "TToolbarFactory.h"
// Подключаем бинарные ресурсы изображений
#include "TImagesFactory.h"
//--------------------------------------
TToolbarFactory::TToolbarFactory()
{
  // Загружаем изображения в объекты класса Image из памяти
  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);
  ImageSwitch_png = ImageCache::getFromMemory(TImagesFactory::psRotate_png, 
              TImagesFactory::iRotate_pngSize);
}
//--------------------------------------
TToolbarFactory::~TToolbarFactory()
{
}
//----------------------------------------
void TToolbarFactory::getAllToolbarItemIds(Array<int>& iIDs)
{
  // Задаём список идентификаторов элементов панели инструментов: 
  // кнопок, разделителей (separators) и распорок (spacers)
  iIDs.add(FileNew);
  iIDs.add(FileOpen);
  iIDs.add(FileQuit);
  iIDs.add(ViewOrientation);
  iIDs.add(spacerId);
  iIDs.add(separatorBarId);
}
//-------------------------------------------
void TToolbarFactory::getDefaultItemSet(Array<int>& iIDs)
{
  // Определяем порядок добавления элементов на инструментальную панель
  iIDs.add(FileQuit);
  iIDs.add(separatorBarId);
  iIDs.add(FileNew);
  iIDs.add(FileOpen);
  iIDs.add(separatorBarId);
  iIDs.add(ViewOrientation);
}
//----------------------------------------------
ToolbarItemComponent* TToolbarFactory::createItem(int iItemID)
{
  switch(iItemID)
  {
    // Создаём кнопки панели инструментов, "привязывая" их 
    // к ранее созданным идентификаторам
    case FileQuit:
    {
        pFileQuitButton = new ToolbarButton(iItemID, "Quit", 
            Drawable::createFromImageData(
            TImagesFactory::psExit_png, 
            TImagesFactory::iExit_pngSize),
          0);
        return pFileQuitButton;
      }
      case FileNew:
      {
      pFileNewButton = new ToolbarButton(iItemID, "New", 
              Drawable::createFromImageData(
              TImagesFactory::psNew_png, 
              TImagesFactory::iNew_pngSize),
              0);
        return pFileNewButton;
    }
    case FileOpen:
    {
              pFileOpenButton = new ToolbarButton(iItemID, "Open", 
              Drawable::createFromImageData(
              TImagesFactory::psOpen_png, 
              TImagesFactory::iOpen_pngSize),
              0);
            return pFileOpenButton;
        }
        case ViewOrientation:
        {
            pViewOrientationButton = new ToolbarButton(iItemID, "Orientation", 
               Drawable::createFromImageData(
               TImagesFactory::psRotate_png, 
               TImagesFactory::iRotate_pngSize),
            0);
        return pViewOrientationButton;
      }
      default:
      {
      break;
    }
  }

  return 0;
}
//-------------------------------------------
Листинг 14.2. Реализация класса "фабрики" элементов инструментальной панели TToolbarFactory (файл TToolbarFactory.cpp)

В конструкторе класса мы инициализируем переменные-члены типа Image бинарными данными, полученными из созданного ранее пространства имён TImagesFactory.

В функции getAllToolbarItemIds мы задаём список идентификаторов элементов панели инструментов. В нашем случае это кнопки, разделители и распорки. Если в качестве идентификаторов кнопок мы используем таковые из нашего перечислимого списка TToolbarItemID ( пример 14.1), то для разделителя и распорки берём стандартные — separatorBarId и spacerId, соответственно.

В функции getDefaultItemSet мы определяем порядок добавления элементов на будущую инструментальную панель. При этом, если в массив iIDs индекс элемента будет добавлен несколько раз, то столько же раз сам элемент будет добавлен на панель инструментов. В нашем случае это будет разделитель ( пример 14.2).

В функции createItem мы создаём собственно элементы инструментальной панели (кроме разделителей и распорок, для которых этого делать не нужно), "привязывая" их к индексам, заданным методом getAllToolbarItemIds. В нашем случае элементами инструментальной панели будут исключительно кнопки класса ToolbarButton. Их свойства и методы большей частью совпадают с таковыми других кнопок с изображениями, описанных в "Элементы управления. Кнопки" .

Конструктор кнопок инструментальной панели ToolbarButton::ToolbarButton(int itemId, const String& labelText, Drawable* normalImage, Drawable* toggledOnImage) принимает следующие параметры:

  • int itemId — уникальный числовой идентификатор (ID);
  • labelText — надпись (как правило не видна, так что можно инициировать этот параметр пустой строкой);
  • normalImage — изображение на кнопке;
  • toggledOnImage — изображение на кнопке, находящейся в фиксированном (on) состоянии. Если параметр принимает значение 0, то будет использовано изображение normalImage вне зависимости от того, была ли включена фиксация кнопки методом getToggleState.

В нашем примере мы не включали фиксацию кнопок, поэтому в их конструкторы передаём только одно изображение из числа инициализированных в конструкторе ( пример 14.2).

Теперь у нас всё готово для того, чтобы добавить панель инструментов в компонент содержимого создаваемой программы.

Помимо собственно инструментальной панели в нашем приложении будет присутствовать полоса состояния (см. "Компоненты ввода и отображения текстовой, цифровой и иерархической информации. Компоненты отображения состояния" ) для отображения подсказок от кнопок, а также ярлык. На нём будут выводиться сообщения о щелчке по той или иной кнопке (реально работать у нас будут только pFileQuitButton и pViewOrientationButton пример 14.3). Объект созданного нами класса TToolbarFactory добавим в компонент содержимого в качестве закрытого члена.

#ifndef _TCentralComponent_h_
#define _TCentralComponent_h_
//--------------------------------------------
#include "../JuceLibraryCode/JuceHeader.h"
// Подключаем наш класс "фабрики" панели инструментов
#include "TToolbarFactory.h"
//--------------------------------------------
class TStatusBar;
//--------------------------------------------
// Класс компонента содержимого.
// Наследует класс слушателя кнопок
class TCentralComponent  : public Component,
      public ButtonListener
{
public:
  TCentralComponent();
  ~TCentralComponent();

  void paint(Graphics&);
  void resized();
  // Функция, отслеживающая щелчки по кнопке
  void buttonClicked(Button*);
  // Функция, отслеживающая движение мыши
  void mouseMove(const MouseEvent&);

private:
  // Ярлык для вывода сообщений
  Label* pInfoLabel;
  // Панель инструментов
  Toolbar* pToolbar;
  TToolbarFactory ToolbarFactory;
  // Полоса состояния
  TStatusBar* pStatusBar;

  // Предотвращает создание копии конструктора и оператора =
  TCentralComponent(const TCentralComponent&);
  const TCentralComponent& operator= (const TCentralComponent&);
};
//------------------------------------
#endif
Листинг 14.3. Объявление класса компонента содержимого TCentralComponent (файл TCentralComponent.h)

Сам по себе объект класса Toolbar лишь создаёт полосу для добавления элементов, однако может определять стиль их отображения. Для этого используется метод void Toolbar::setStyle(const ToolbarItemStyle& newStyle), который в качестве параметра принимает идентификатор перечислимого типа ToolbarItemStyle:

  • iconsOnly — панель инструментов отображает лишь пиктограммы кнопок (по умолчанию);
  • iconsWithText — под каждой кнопкой будет отображаться её надпись (второй параметр конструктора) в стиле KDE;
  • textOnly — вместо кнопок на панели инструментов будут отображаться их ярлыки с надписями.

В нашем примере мы не используем этот метод.

< Лекция 13 || Лекция 14: 123 || Лекция 15 >