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

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

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

Для создания и последующего отображения элементов инструментальной панели необходимо создать объект класса, унаследованного от ToolbarItemFactory, и передать его в качестве параметра в метод void Toolbar::addDefaultItems(ToolbarItemFactory& factoryToUse) ( пример 14.4).

#include "TCentralComponent.h"
#include "TStatusBar.h"
//---------------------------------------------
#define tr(s) String::fromUTF8(s)
//---------------------------------------------
TCentralComponent::TCentralComponent() : Component ("Central Component"),
           pInfoLabel(0),
           pToolbar(0)
{
  // Создаём панель инструментов
  pToolbar = new Toolbar();
  addAndMakeVisible(pToolbar);
  // Панель инструментов - горизонтальная
  pToolbar->setVertical(false);
  // Добавляем на панель кнопки
  pToolbar->addDefaultItems(ToolbarFactory);
  // Добавляем слушатель мыши
  pToolbar->addMouseListener(this, true);
  
  // Добавляем слушатели кнопок
  ToolbarFactory.pFileNewButton->addListener(this);
  ToolbarFactory.pFileQuitButton->addListener(this);
  ToolbarFactory.pFileOpenButton->addListener(this);
  ToolbarFactory.pViewOrientationButton->addListener(this);
  
  pInfoLabel = new Label("Info Label", 
      tr("Нажмите кнопку панели инструментов!"));
  pInfoLabel->setJustificationType(Justification::centred);
  pInfoLabel->setColour(Label::backgroundColourId, Colours::azure);
  addAndMakeVisible(pInfoLabel);
  
  // Создаём панель состояния
  pStatusBar = new TStatusBar();
  pStatusBar->ShowHint(tr("Готов"));
  addAndMakeVisible(pStatusBar);

  setSize (400, 200);
}
Листинг 14.4. Реализация конструктора класса компонента содержимого TCentralComponent (файл TCentralComponent.cpp)

Библиотека Juce позволяет создавать инструментальные панели двух видов: вертикальные и горизонтальные (традиционные). Для того, чтобы задать ориентацию панели, необходимо вызвать метод void Toolbar::setVertical(bool shouldBeVertical), где shouldBeVertical — флаг того, должна ли она быть вертикальной ( пример 14.4).

В качестве завершающего этапа добавим слушатели кнопок как в саму панель инструментов, так и в каждую из её кнопок. Как и в предыдущих примерах, в качестве слушателя выступит сам компонент содержимого ( пример 14.3).

Для того, чтобы панель инструментов, будучи вертикальной, не перекрывала полосу состояния, мы рассчитываем длину первой ( пример 14.5). Узнать ориентацию инструментальной панели нам помогает метод bool Toolbar::isVertical() const throw().

void TCentralComponent::resized()
{
  if(pToolbar->isVertical())
  {
    pToolbar->setBounds(0, 0, 25, getHeight() - 25);
    pInfoLabel->setBounds(25, proportionOfHeight(0.5000f),  
        proportionOfWidth(1.0000f), 25);
  }
  else
  {
    pToolbar->setBounds(0, 0, getWidth(), 25);
    pInfoLabel->setBounds(0, proportionOfHeight(0.5000f), 
        proportionOfWidth(1.0000f), 25);
  }
  
  pStatusBar->setBounds(0, proportionOfHeight(1.0000f) - 25, 
        proportionOfWidth(1.0000f), 25);
}
Листинг 14.5. Реализация метода resized класса компонента содержимого TCentralComponent (файл TCentralComponent.cpp)

Собственно логика работы программы приведена в листинге 14.6 и понятна без дополнительных комментариев.

void TCentralComponent::buttonClicked(Button* pButton)
{
  if(pButton == ToolbarFactory.pFileQuitButton)
  {
    JUCEApplication::quit();
  }
  else if(pButton == ToolbarFactory.pFileNewButton)
  {
    pInfoLabel->setText(tr("Нажата кнопка \"Новый\"."), false);
  }
  else if(pButton == ToolbarFactory.pFileOpenButton)
  {
    pInfoLabel->setText(tr("Нажата кнопка \"Открыть\"."), false);
  }
  else if(pButton == ToolbarFactory.pViewOrientationButton)
  {
    pToolbar->setVertical(!pToolbar->isVertical());
    this->resized();
    pInfoLabel->setText(tr("Нажата кнопка \"Ориентация\"."), false);
  }
}
//------------------------------------------------
void TCentralComponent::mouseMove(const MouseEvent& Event)
{
  // Отработка показа подсказок кнопок панели инструментов при наведении
  // на них мыши
  if(Event.source.getComponentUnderMouse() == ToolbarFactory.pFileQuitButton)
  {
    pStatusBar->ShowHint(tr("Нажмите, чтобы завершить работу программы"));
  }
  else if(Event.source.getComponentUnderMouse() == 
        ToolbarFactory.pFileNewButton)
  {
    pStatusBar->ShowHint(tr("Нажмите эту кнопку"));
  }
  else if(Event.source.getComponentUnderMouse() ==
         ToolbarFactory.pFileOpenButton)
  {
    pStatusBar->ShowHint(tr("Нажмите эту кнопку"));
  }
  else if(Event.source.getComponentUnderMouse() == 
         ToolbarFactory.pViewOrientationButton)
  {
    pStatusBar->ShowHint(
         tr("Нажмите эту кнопку, чтобы установить панель 
           инструментов вертикально / горизонтально"));
  }
  else
  {
    pStatusBar->ShowHint(tr("Готов"));
  }
}
Листинг 14.6. Часть реализации класса компонента содержимого TCentralComponent (файл TCentralComponent.cpp)

При щелчке по той или иной кнопке происходит либо просто вывод соответствующего сообщения, либо выполняется ещё и какое-либо действие, например, изменение положения инструментальной панели (рисунок 14.2 ).

Вертикальное расположение инструментальной панели

Рис. 14.2. Вертикальное расположение инструментальной панели

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

Для создания панели инструментов приложения нам необходимо описать набор команд и связать его с соответствующими инструментальными кнопками ToolbarButton, которые добавляются на панель объектом класса ToolbarItemFactory. За отрисовку полосы (панели), содержащей эти кнопки в порядке, определяемом ToolbarItemFactory, отвечает объект класса Toolbar.

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

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

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