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