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

Компоненты ввода и отображения текстовой, цифровой и иерархической информации. Компоненты отображения состояния

< Лекция 10 || Лекция 11: 123 || Лекция 12 >
Аннотация: В этой лекции вы познакомитесь с компонентами отображения состояния и научитесь использовать класс ToggleButton для создания виджетов "флажок" и "радиокнопка". Кроме того, вы научитесь создавать полосу состояния.

Цель лекции: Научиться использовать класс ToggleButton для создания виджетов "флажок" и "радиокнопка", а также создавать полосу состояния приложения, отображающую его подсказки и текущее время системы

Использование класса ToggleButton для создания индикаторов с флажком

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

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

Проверить состояние индикатора (флажок сброшен / включён) можно с помощью метода bool Button::getToggleState() const throw(), который возвращает false в случае, если флажок сброшен, и true, если индикатор выбран.

Выбрать индикатор можно не только щелчком мыши, но и программно, используя метод void Button::setToggleState(bool shouldBeOn, bool sendChangeNotification), где shouldBeOn — флаг включения / сброса флажка. В том случае, если параметр sendChangeNotification принимает значение true, то при выборе индикатора генерируется сообщение о нажатии кнопки; в противном случае этого не происходит.

Помимо собственно поля с флажком, индикатор включает поясняющую надпись. Её текст можно либо задать в конструкторе (ToggleButton::ToggleButton(const String& buttonText = String::empty)) при объявлении экземпляра класса, либо так же, как у любой кнопки, с помощью функции void Button::setButtonText(const String& newText).

Получить текст надписи индикатора можно с помощью метода const String Button::getButtonText() const.

Рассмотрим использование класса ToggleButton на небольшом примере. Создадим окно с неизменяемыми размерами и единственной кнопкой минимизации в заголовке ( рис. 11.1, пример 11.1).

Работа программы, демонстрирующей использование флажков

Рис. 11.1. Работа программы, демонстрирующей использование флажков
#include "TMainForm.h"
#include "TCentralComponent.h"
//------------------------------------------------------
TMainForm::TMainForm() : DocumentWindow(
            JUCEApplication::getInstance()->getApplicationName(),
            Colours::azure,
            // В заголовке — только кнопка минимизации
            DocumentWindow::minimiseButton)
{
  centreWithSize(400, 200);
  // Запрет на изменение размеров окна
  setResizable(false, false);
  setVisible(true);

  pCentralComponent = new TCentralComponent();
  setContentOwned(pCentralComponent, true);
}
//------------------------------------------------------
TMainForm::~TMainForm()
{
}
//------------------------------------------------------
Листинг 11.1. Реализация класса главного окна демонстрационного приложения (файл TMainForm.cpp)

Центральный компонент окна будет включать следующие виджеты: два флажка (класс ToggleButton), ярлык с приветственной надписью (Label) и кнопку, ответственную за завершение работы программы (TextButton). Ярлык и кнопка при запуске приложения будут невидимы. Отображение / скрытие этих виджетов будет осуществляться посредством включения / сброса соответствующего флажка. Внешний вид работающей программы представлен на рисунке 11.1 .

Реализация класса компонента содержимого приведена в листинге 11.2 .

#include "TCentralComponent.h"
//-------------------------------------------------------
#define tr(s) String::fromUTF8(s)
//-------------------------------------------------------
TCentralComponent::TCentralComponent() : Component("Central Component"),
            pShowGreetingButton(0),
            pShowCloseButton(0),
            pHelloLabel(0),
            pCloseButton(0)
{
  // Флажок, отображающий / скрывающий надпись "Привет, мир!"
  pShowGreetingButton = new ToggleButton(tr("Показать приветствие"));
  pShowGreetingButton->addListener(this);
  addAndMakeVisible(pShowGreetingButton);

  // Флажок, отображающий / скрывающий кнопку выхода
  pShowCloseButton = new ToggleButton(tr("Показать кнопку выхода"));
  pShowCloseButton->addListener(this);
  addAndMakeVisible(pShowCloseButton);

  // Надпись - приветствие
  pHelloLabel = new Label("Hello Label", tr("Привет, мир!"));
  addAndMakeVisible(pHelloLabel);
  pHelloLabel->setFont(Font(20.0000f, Font::bold));
  pHelloLabel->setJustificationType(Justification::left);
  pHelloLabel->setEditable(false, false, false);
  pHelloLabel->setColour(Label::textColourId, Colours::blue);
  pHelloLabel->setColour(TextEditor::textColourId, Colours::black);
  pHelloLabel->setColour(TextEditor::backgroundColourId, Colours::azure);

  // Кнопка завершения работы программы
  pCloseButton = new TextButton("Close Button");
  addAndMakeVisible(pCloseButton);
  pCloseButton->setButtonText(tr("Выход"));
  pCloseButton->addListener(this);

  setSize(500, 150);

  // Прячем надпись и кнопку
  pHelloLabel->setVisible(false);
  pCloseButton->setVisible(false);
}
//-------------------------------------------------------
TCentralComponent::~TCentralComponent()
{
  deleteAllChildren();
}
//-------------------------------------------------------
void TCentralComponent::paint(Graphics& Canvas)
{
  Canvas.fillAll(Colours::azure);
}
//-----------------------------------------------------
void TCentralComponent::resized()
{
  pShowGreetingButton->setBounds(10, 10, 200, 25);
  pShowCloseButton->setBounds(10, 40, 200, 25);
  pHelloLabel->setBounds(230, 10, 250, 25);
  pCloseButton->setBounds(230, 80, 150, 25);
}
//-----------------------------------------------------
void TCentralComponent::buttonClicked(Button* pButton)
{
  if(pButton == pCloseButton)
  {
    // Выходим...
    JUCEApplication::quit();
  }
  else if(pButton == pShowGreetingButton)
  {
    // Прячем / показываем надпись в зависимости от состояния флажка
    pHelloLabel->setVisible(pShowGreetingButton->getToggleState());
  }
  else if(pButton == pShowCloseButton)
  {
    // Прячем / показываем кнопку выхода 
    // в зависимости от состояния флажка
    pCloseButton->setVisible(pShowCloseButton->getToggleState());
  }
}
//----------------------------------------------------
Листинг 11.2. Реализация класса компонента содержимого демонстрационного приложения (файл TCentralComponent.cpp)
< Лекция 10 || Лекция 11: 123 || Лекция 12 >
Иван Иванов
Иван Иванов
Россия
Александр Тырин
Александр Тырин
Россия