Россия |
Компоненты ввода и отображения текстовой, цифровой и иерархической информации. Компоненты отображения состояния
При создании виджетов ярлыков мы не задаём им никакого текста (надпись инициализируется пустой строкой, поскольку необходимая информация будет выводится на них соответствующими методами класса. При этом выравнивание текста в надписях задано таким образом, чтобы текст подсказок располагался у левого края окна программы, а дата и время — у правого.
В конструкторе класса TStatusBar мы вначале принудительно вызываем метод timerCallback(), для того, чтобы немедленно отобразить дату и время при старте программы, после чего запускаем таймер функцией void Timer::startTimer(int intervalInMilliseconds) throw(), где intervalInMilliseconds — период срабатывания таймера и миллисекундах. При каждом срабатывании таймера вызывается метод timerCallback().
Обратите внимание, что при завершении работы программы таймер должен быть остановлен в деструкторе класса вызовом метода void Timer::stopTimer() throw().
Рассмотрим реализацию метода timerCallback() ( пример 11.4). Для манипуляций с датой и временем в библиотеке Juce есть класс Time. Воспользуемся его методом static const Time JUCE_CALLTYPE Time::getCurrentTime() throw() для получения абсолютного системного времени. Возвращаемым значением метода является объект класса Time, которому это значение присвоено. Сохраним возвращаемое значение в переменной Time DateTime.
Класс Time включает ряд методов, которые позволяют вычислить год, день месяца и т.п., исходя из абсолютного системного времени:
- int Time::getYear() const throw() - возвращает год в формате YYYY (например, 2011);
- int Time::getDayOfMonth() const throw() - возвращает день месяца (целое в диапазоне от 1 до 31);
- int Time::getMonth() const throw() - возвращает номер месяца (целое в диаазоне от 0 до 11). Понятно, что для приведения номера месяца к привычному виду, к возвращаемому значению функции следует прибавить единицу ( пример 11.4);
- int Time::getHours() const throw() - возвращает число часов, отсчитанное от полуночи (целое в диапазоне от 0 до 23);
- int Time::getMinutes() const throw() - возвращает число минут, прошедших с начала текущего часа (целое в диапазоне от 0 до 59);
- int Time::getSeconds() const throw() - возвращает число секунд, прошедших с начала текущей минуты (целое в диапазоне от 0 до 59).
Преобразование целых чисел (год, номер месяца и т.п.) в отформатированную строку, в которой к цифрам в диапазоне от 0 до 9 прибавляется ноль, осуществляет наш метод String TStatusBar::sFormatDate(int iNumber). Его работа понятна из комментариев к коду ( пример 11.4). После получения строк, содержащих информацию о текущих дате и времени, мы формируем результирующую строку Strin sDateTime и устанавливаем её в качестве текста для отображения ярлыком pDateTimeLabel.
Работа нашего метода void TStatusBar::ShowHint(String sHint) предельно проста: он отображает на ярлыке pMessagesLabel текст, получаемый в качестве параметра ( пример 11.4).
Теперь можно испытать работоспособность вновь созданного виджета в нашем примере. Добавим переменную TStatusBar* pStatusBar в качестве закрытого члена класса компонента содержимого TCentralComponent. Рассмотрим реализацию последнего ( пример 11.5).
#include "TCentralComponent.h" #include "TStatusBar.h" //------------------------------------------------------ #define tr(s) String::fromUTF8(s) //------------------------------------------------------ TCentralComponent::TCentralComponent() : Component ("Central Component"), pHelloLabel(0), pCloseButton(0) { pHelloLabel = new Label("Hello Label", tr("Привет, мир!")); pHelloLabel->setColour(Label::outlineColourId, Colours::black); pHelloLabel->addMouseListener(this, false); addAndMakeVisible(pHelloLabel); pHelloLabel->setFont(Font(38.0000f, Font::bold)); // Ориентация текста ярлыка - по центру виджета pHelloLabel->setJustificationType(Justification::centred); // Зпрет на редактирование содержимого ярлыка pHelloLabel->setEditable(false, false, false); // Синий цвет шрифта pHelloLabel->setColour(Label::textColourId, Colours::blue); pHelloLabel->setColour(TextEditor::backgroundColourId, Colours::azure); pCloseButton = new TextButton("Close Button"); addAndMakeVisible(pCloseButton); pCloseButton->setButtonText(tr("Закрыть")); // Устанавливаем в качестве слушателя кнопки // сам компонент-контейнер pCloseButton->addListener(this); pCloseButton->addMouseListener(this, false); // Создаём панель состояния pStatusBar = new TStatusBar(); addAndMakeVisible(pStatusBar); setSize (400, 200); } //------------------------------------------------------- TCentralComponent::~TCentralComponent() { // Удаляем дочерние виджеты // и обнуляем их указатели deleteAllChildren(); } //------------------------------------------------------ void TCentralComponent::paint(Graphics& Canvas) { Canvas.fillAll(Colours::azure); } //------------------------------------------------------- void TCentralComponent::resized() { pHelloLabel->setBounds(0, 0, proportionOfWidth(1.0000f), proportionOfHeight(0.7000f)); pCloseButton->setBounds(getWidth() - 20 - 100, getHeight() - 55, 100, 25); // Рстягиваем панель состояния по ширине родительского виджета pStatusBar->setBounds(0, proportionOfHeight(1.0000f) — 25, proportionOfWidth(1.0000f), 25); } //------------------------------------------------------ void TCentralComponent::buttonClicked(Button* pButton) { // Если нажата кнопка "Закрыть"... if(pButton == pCloseButton) { // выходим из программы JUCEApplication::quit(); } }------------------------------------------------------- void TCentralComponent::mouseMove(const MouseEvent& Event) { if(Event.originalComponent == pHelloLabel) { pStatusBar->ShowHint(tr("Привет, мир!")); } else if(Event.source.getComponentUnderMouse() == pCloseButton) { pStatusBar->ShowHint(tr("Нажмите, чтобы завершить работу программы")); } else { pStatusBar->ShowHint(""); } } //--------------------------------------------------------Листинг 11.5. Реализация класса компонента содержимого TCentralComponent (файл TCentralComponent.cpp)
В нашем примере за логику работы программы отвечает метод mouseMove. Мы сравниваем указатель на компонент, который вызвал событие мыши (Component* const MouseEvent::eventComponent) с указателями на дочерние виджеты и в случае совпадения выводим на панель состояния соответствующую подсказку. В противном случае текст ярлыка pMessagesLabel очищается.
Внешний вид программы, иллюстрирующей создание панели состояния представлен на рисунке 11.2 .
Полоса или индикатор выполнения — это виджет, представляющий собой прямоугольную панель и показывающий процесс выполнения операции путём заполнения (заливки) своего содержимого слева направо. Иногда это сопровождается текстовым сообщением о проценте прогресса выполнения операции. Полное заполнение индикатора свидетельствует о завершении выполнения операции. Этот виджет необходим в том случае, когда программа выполняет какое-либо длительное действие. Он даёт пользователю понять, что программа не зависла, а продолжает операцию.
В библиотеке Juce этот виджет представлен классом ProgressBar. Пример использования объекта этого класса и разбор его свойств и методов приведены в главе 13 (листинги пример 13.1, пример 13.2, пример 13.2).
Краткие итоги
Для создания группы переключателей (радиокнопок) и индикатора с флажком в Juce используется один и тот же класс, ToggleButton. Внешний вид и поведение того или иного объекта класса зависит от опций, включённых программистом.
Класс ToggleButton наследует классу кнопки (Button) и включает многие методы, общие для всх кнопок.
Упражнение
Напишите простейшую программу-анкету. Пользователь отвечает на вопрос "Что привлекает Вас в издании?", отмечая флажки ("Стиль подачи материала", "Достоверность информации", "Дизайн и оформление" и т.п.). При нажатии на кнопку "Ответить" текст отмеченных флажков добавляется в текстовое поле (TextEditor).
Дополнительные материалы
Архив с исходными текстами примеров Вы можете скачать здесь