| Россия |
Компоненты ввода и отображения текстовой, цифровой и иерархической информации. Компоненты отображения состояния
Цель лекции: Научиться использовать класс 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).
#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)
