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

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

< Лекция 10 || Лекция 11: 123 || Лекция 12 >

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

В конструкторе класса 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 .

Программа, иллюстрирующая создание панели состояния

Рис. 11.2. Программа, иллюстрирующая создание панели состояния

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

В библиотеке Juce этот виджет представлен классом ProgressBar. Пример использования объекта этого класса и разбор его свойств и методов приведены в главе 13 (листинги пример 13.1, пример 13.2, пример 13.2).

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

Для создания группы переключателей (радиокнопок) и индикатора с флажком в Juce используется один и тот же класс, ToggleButton. Внешний вид и поведение того или иного объекта класса зависит от опций, включённых программистом.

Класс ToggleButton наследует классу кнопки (Button) и включает многие методы, общие для всх кнопок.

Упражнение

Напишите простейшую программу-анкету. Пользователь отвечает на вопрос "Что привлекает Вас в издании?", отмечая флажки ("Стиль подачи материала", "Достоверность информации", "Дизайн и оформление" и т.п.). При нажатии на кнопку "Ответить" текст отмеченных флажков добавляется в текстовое поле (TextEditor).

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

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

< Лекция 10 || Лекция 11: 123 || Лекция 12 >