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

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

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

Использование класса ToggleButton для создания переключателей (радиокнопок)

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

Переключатель представляет собой виджет, который может находиться в одном из двух состояний: включено или выключено, т.е., так же, как и флажок представляет собой кнопку выключателя. Поэтому для создания радиокнопок в Juce используется всё тот же класс, ToggleButton.

Применение класса ToggleButton для создания радиокнопок рассматривалось нами в примерах, приведённых в лекциях 6 и 8.

Повторим лишь, что для объединения переключателей в одну группу, необходимо воспользоваться методом void Button::setRadioGroupId(int newGroupId). Если метод у нескольких радиокнопок принимает в качестве параметра какое-либо одно, отличное от нуля, целое число, то эти кнопки начинают действовать как единая радиогруппа, т.е. возможно включение одной и только одной кнопки из набора.

Класс GroupComponent

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

Текст поясняющей надписи может быть задан либо в конструкторе GroupComponent при объявлении экземпляра класса (GroupComponent::GroupComponent(const String& componentName = String::empty, const String& labelText = String::empty)), либо с использованием метода void GroupComponent::setText(const String& newText).

Программно получить текст надписи позволяет функция-член const String GroupComponent::getText() const.

По умолчанию текст надписи GroupComponent ориентирован влево. Изменить ориентацию позволяет метод void GroupComponent::setTextLabelPosition(const Justification& justification), где justification — флаг выравнивания текста (класс Justification). Понятно, что в случае виджета-рамки целесообразно пользоваться флагами Justification::left (влево), Justification::right (вправо) и Justification::centred (по центру).

Полоса состояния имеется во многих современных программах. Она располагается в нижней части главного окна приложения и отображает информацию о состоянии программы, подсказки от виджетов при наведении на них указателя мыши и т.п.

К сожалению, в библиотеке Juce нет стандартного компонента для создания полосы состояния, но класс подобного виджета несложно написать самим.

Пусть наша полоса состояния отображает следующую информацию: выводит текущие дату и время, а также подсказки от виджетов компонента содержимого. Для упрощения задачи в качестве основы для нашего приложения воспользуемся уже готовым примером из "Разработка собственных компонентов" (см. листинги пример 4.1 и пример 4.2).

Объявим класс полосы состояния TStatusBar, который унаследуем от классов Component и Timer ( пример 11.3).

#ifndef _TStatusBar_h_
#define _TStatusBar_h_
//-------------------------------------------------------
#include "../JuceLibraryCode/JuceHeader.h"
//-------------------------------------------------------
// Наследуем класс полосы состояния от класса таймера
class TStatusBar : public Component,
          public Timer
{
public:
  TStatusBar();
  ~TStatusBar();
  
  void paint(Graphics&);
  void resized();
  
  // Периодически вызываемая функция (временной интервал вызова
  // функции задаётся методом startTimer)
  void timerCallback();
  
  // Функция, выводящая подсказку на pMessagesLabel
  void ShowHint(String);
  
private:
  Label* pMessagesLabel;
  Label* pDateTimeLabel;
  
  String sFormatDate(int);
};
//--------------------------------------------------------
#endif
Листинг 11.3. Объявление класса полосы состояния TStatusBar (файл TStatusBar.h

Мы унаследовали класс виджета полосы состояния от класса таймера (Timer), который включает чистую виртуальную функцию virtual void Timer::timerCallback(). Именно эта функция будет ответственна в нашем примере за отображение даты и времени.

Кроме того, наш виджет будет включать два компонента: ярлыки pMessagesLabel, на который будет выводиться текст подсказок, и pDateTimeLabel, который будет отображать дату и время.

Предусмотрим в нашем классе метод, который будет отвечать за отображение подсказок на pMessageLabel — void TStatusBar::ShowHint(String).

Рассмотрим реализацию нашего класса ( пример 11.4).

#include "TStatusBar.h"
#include "../JuceLibraryCode/JuceHeader.h" 
//------------------------------------------------
TStatusBar::TStatusBar() : Component("StatusBar"),
            Timer()
{
  pMessagesLabel = new Label("MessagesLabel", "");
  addAndMakeVisible(pMessagesLabel);
  pMessagesLabel->setColour(Label::backgroundColourId, Colours::azure);
  
  pDateTimeLabel = new Label("DateTimeLabel", "");
  addAndMakeVisible(pDateTimeLabel);
  // Дата и время отображаются у правого края окна программы
  pDateTimeLabel->setJustificationType(Justification::right);
  pDateTimeLabel->setColour(Label::backgroundColourId, Colours::azure);
  
  // В первый раз отображаем дату и время
  this->timerCallback();
  // Вызываем функцию timerCallback каждую секунду
  this->startTimer(1000);
}
//----------------------------------------------------
TStatusBar::~TStatusBar()
{
  // При завершении работы останавливаем таймер
  this->stopTimer();
  deleteAllChildren();
}
//----------------------------------------------------
void TStatusBar::paint(Graphics& Canvas)
{
  Canvas.fillAll(Colours::azure);
}
//----------------------------------------------------
void TStatusBar::resized()
{
  pMessagesLabel->setBounds(0, proportionOfHeight(1.0000f) — 25,
            proportionOfWidth(0.6000f), 25);
  pDateTimeLabel->setBounds(proportionOfWidth(0.6500f),
            proportionOfHeight(1.0000f) - 25, 
            proportionOfWidth(0.3500f), 25);
}
//----------------------------------------------------
// Функция форматирования даты (выводит предшествующий ноль в однозначных цифрах)
String TStatusBar::sFormatDate(int iNumber)
{
  // Преобразуем число в соответствующую строку
  String sNumber = String(iNumber);
  switch(iNumber)
  {
    case 0:
    case 1:
    case 2:
    case 3:
    case 4:
    case 5:
    case 6:
    case 7:
    case 8:
    case 9:
    {
      // Если число в диапазоне от 0 до 9,
      // добавим в начало соответствующей ему строки ноль
      sNumber = (String("0") += sNumber);
      break;
    }
    default:
    {
      break;
    }
  }
  return sNumber;
}
//---------------------------------------------------------
void TStatusBar::timerCallback()
{
  // Получаем текущую дату и время
  Time DateTime = Time::getCurrentTime();
  // Форматируем день (число месяца)
  String sDay = sFormatDate(DateTime.getDayOfMonth());
  // Форматируем месяц
  String sMonth = sFormatDate(DateTime.getMonth() + 1);
  // Получаем год в виде строки
  String sYear = String(DateTime.getYear());
  // Форматируем час, минуты и секунды текущей даты
  String sHours = sFormatDate(DateTime.getHours());
  String sMinutes = sFormatDate(DateTime.getMinutes());
  String sSeconds = sFormatDate(DateTime.getSeconds());
  // Формируем результирующую строку
  String sDateTime = sDay + "." + sMonth + "." + sYear + " - " +
            sHours + ":" + sMinutes + ":" + sSeconds;
  // Отображаем отформатированные дату и время
  pDateTimeLabel->setText(sDateTime, false);
}
//------------------------------------------------------
void TStatusBar::ShowHint(String sHint)
{
  // Отображаем строку подсказки, полученную в качестве параметра
  pMessagesLabel->setText(sHint, false);
}
//-----------------------------------------------------
Листинг 11.4. Реализация класса полосы состояния TStatusBar (файл TStatusBar.cpp)
< Лекция 10 || Лекция 11: 123 || Лекция 12 >