Опубликован: 13.07.2012 | Уровень: специалист | Доступ: платный
Лекция 12:

Элементы управления. Кнопки

< Лекция 11 || Лекция 12: 1234 || Лекция 13 >
Аннотация: В этой лекции описывается работа с различными кнопками (классы TextButton, ArrowButton, ImageButton, DrawableButton, ShapeButton, ToolbarItemComponent и HyperlinkButton).

Цель лекции: Научиться использовать классы кнопок Juce в своих программах.

Кнопки представляют, пожалуй, одну из наиболее часто используемых групп виджетов. Базовым классом для них является Button, которому наследуют классы кнопки с текстом TextButton (пример ее использования рассматривался нами в "Разработка собственных компонентов" и многих последующих главах), кнопки со стрелкой ArrowButton, кнопок с изображениями (ImageButton, DrawableButton и ShapeButton), кнопки панели инструментов (ToolbarItemComponent), а также ряд компонентов, которые имеют по своим функциям лишь косвенное отношение к кнопкам: гиперссылка (HyperlinkButton), флажок (ToggleButton), который рассматривался нами в "Компоненты ввода и отображения текстовой, цифровой и иерархической информации. Компоненты отображения состояния" и вкладка (TabBarButton).

TextButton — это кнопка со стандартными (для Juce) формой и фоном и отображаемой на поверхности строкой текста. Кнопка TextButton может работать в двух режимах: простая управляющая кнопка (включено по умолчанию) и кнопка с фиксацией нажатого состояния. Для включения последнего режима необходимо вызвать метод void Button::setClickingTogglesState(bool shouldToggle) throw() с параметром true. Кроме того, возможно использование набора кнопок с фиксацией нажатого состояния, где в нажатом (on) состоянии может находиться одна и только одна кнопка. Для создания подобной группы используют методы void Button::setToggleState(bool shouldBeOn, bool sendChangeNotification) для задания режима фиксации и void Button::setRadioGroupId(int newGroupId) для включения кнопок в единую группу путем задания общего ID. Использование этих методов совершенно идентично таковому у ToggleButton "Компоненты ввода и отображения текстовой, цифровой и иерархической информации. Компоненты отображения состояния" .

Следует заметить, что, в отличие от других библиотек для построения графического интерфейса пользователя, в Juce кнопка в нажатом состоянии меняет только цвет фона. Цвета кнопки в нажатом (on) и отжатом (off) состоянии определяются значениями идентификаторов цвета перечислимого типа enum TextButton::ColourIds:

  • buttonColourId — цвет фона кнопки в ненажатом состоянии;
  • buttonOnColourId — цвет фона кнопки в нажатом состоянии;
  • textColourOffId — цвет текста кнопки в ненажатом состоянии;
  • textColourOnId — цвет текста кнопки в нажатом состоянии.

Задать необходимое значение цвета фона либо текста кнопки можно вызовом метода void Component::setColour(int colourId, const Colour& colour), передав в качестве параметра один из идентификаторов ColourIds.

Основное свойство с точки зрения внешнего вида кнопки с текстом — это, конечно же, надпись. Для работы с ней класс TextButton включает два метода, унаследованные от класса Button:

  • void Button::setButtonText(const String& newText изменяет надпись на кнопке на newText
  • const String Button::getButtonText() const— возвращает текст, отображаемый на кнопке.

Как правило, программист сам заботится о том, чтобы размеры кнопки и отображаемой ею надписи соответствовали друг другу. Однако в случае, если надпись на кнопке меняется в процессе выполнения программы, может возникнуть необходимость "подогнать" размеры кнопки под новый текст. В этом поможет метод void TextButton::changeWidthToFitText(int newHeight = -1). В том случае, если значение newHeight больше нуля, то высота кнопки будет меняться таким образом, чтобы вместить новый текст, не превышая, однако, значения, заданного параметром. Если же оно меньше нуля, то высота кнопки меняться не будет, а будет меняться ее ширина. Рассмотрим использование метода на примере. Наше приложение будет включать два виджета: кнопку с надписью и поле ввода ( рис. 12.1).

 Программа, иллюстрирующая работу кнопки с текстом и изменяемой шириной

Рис. 12.1. Программа, иллюстрирующая работу кнопки с текстом и изменяемой шириной

При нажатии на кнопку надпись последней будет меняться на текст в поле ввода при его наличии. При этом ширина кнопки будет меняться в зависимости от размеров новой надписи, а высота будет оставаться прежней пример 12.1

 
#include "TCentralComponent.h"
//---------------------------------------------------------------------
#define tr(s) String::fromUTF8(s)
//---------------------------------------------------------------------
TCentralComponent::TCentralComponent() : Component ("Central Component"),
                     pTextButton(0),
                     pTextEdit(0)
{
  pTextButton = new TextButton("Text Button");
  pTextButton->addListener(this);
  pTextButton->setButtonText(tr("Введи новый текст и нажми кнопку"));
  addAndMakeVisible(pTextButton);

  pTextEdit = new TextEditor("Text Editor");
  pTextEdit->setReturnKeyStartsNewLine(false);
  pTextEdit->setText(String::empty);
  addAndMakeVisible(pTextEdit);

  setSize (400, 150);
}
//---------------------------------------------------------------------
TCentralComponent::~TCentralComponent()
{
  // Удаляем дочерние виджеты
  // и обнуляем их указатели
  deleteAllChildren();
}
//---------------------------------------------------------------------
void TCentralComponent::paint(Graphics& Canvas)
{
  Canvas.fillAll(Colours::azure);
}
//---------------------------------------------------------------------
void TCentralComponent::resized()
{
  // Задаем стартовые размеры кнопки
  pTextButton->setBounds(20, 16, 240, 25);
  // "Подгоняет" размеры кнопки под отображаемую надпись
  pTextButton->changeWidthToFitText(-1);
  pTextEdit->setBounds(20, 56, getWidth() - 40, 25);
}
//---------------------------------------------------------------------
void TCentralComponent::buttonClicked(Button* pButton)
{
  // Если нажата кнопка...
  if(pButton == pTextButton)
  {
    // и поле ввода не пусто...
    if(!pTextEdit->getText().containsNonWhitespaceChars()) return;
    // в качестве надписи устанавливаем
    // текст из поля ввода
    pTextButton->setButtonText(pTextEdit->getText());
    // "Подгоняет" размеры кнопки под отображаемую надпись
    pTextButton->changeWidthToFitText(-1);
  }
}
//---------------------------------------------------------------------
Листинг 12.1. Реализация класса компонента содержимого TCentralComponent (файл TCentralComponent.cpp)
< Лекция 11 || Лекция 12: 1234 || Лекция 13 >
Иван Иванов
Иван Иванов
Россия
Александр Тырин
Александр Тырин
Россия