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

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

< Лекция 11 || Лекция 12: 1234 || Лекция 13 >

В случае использования juce этот массив добавляется в конец реализации класса компонента содержимого, а в случае использования BinaryBuilder — в файл реализации пространства имен.

Переменная static const char*, описывающая изображение, инициализируется данными из этого массива ( пример 12.3, пример 12.4).

const char* TImagesFactory::psGimpbuttondown_png = 
(const char*)ucGimpbuttondown_png;
Листинг 12.4. Инициализация переменной, описывающей бинарный ресурс, в отдельном пространстве имен

Рассмотрим использование бинарных ресурсов для создания DrawableButton. Мы заранее подготовили их с помощью BinaryBuilder (файлы TImagesFactory.h и TImagesFactory.cpp, которые можно найти на прилагаемом компакт-диске). Пространство имен включает переменные extern const char* psGimpbuttondown_png и extern const char* psGimpbuttonup_png, описывающие изображения кнопки, созданные в GIMP рис. 12.3. Как видно из листинга 12.5, реализация класса компонента содержимого практически не изменилась: мы лишь подключили пространство имен TImagesFactory и воспользовались методом static const Image ImageCache::getFromMemory(const void* imageData, int dataSize) для загрузки изображений в DrawableImage не из графического файла, а из памяти.

#include "TCentralComponent.h"
// Подключаем пространство имен TImagesFactory
#include "TImagesFactory.h"
//---------------------------------------------------------------------
#define tr(s) String::fromUTF8(s)
//---------------------------------------------------------------------
TCentralComponent::TCentralComponent() : Component ("Central Component"),
                     pHelloLabel(0),
                     pCloseButton(0)
{
  pHelloLabel = new Label("Hello Label", tr("Привет, мир!"));
  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::textColourId, Colours::black);
  pHelloLabel->setColour(TextEditor::backgroundColourId, Colours::azure);

  // Изображение для ненажатой кнопки
  DrawableImage UpImage;
  // Изображение для нажатой кнопки
  DrawableImage DownImage;
  // Загружаем изображение в DrawableImage из памяти
  UpImage.setImage(ImageCache::getFromMemory(
                    TImagesFactory::psGimpbuttonup_png,
                    TImagesFactory::iGimpbuttonup_pngSize));
  DownImage.setImage(ImageCache::getFromMemory(
                   TImagesFactory::psGimpbuttondown_png,
                   TImagesFactory::iGimpbuttondown_pngSize));

  // Создаем пустую DrawableButton
  pCloseButton = new DrawableButton("CloseButton", 
                   DrawableButton::ImageAboveTextLabel);
  // Устанавливаем изображения для различных состояний кнопки
  pCloseButton->setImages(& UpImage, & UpImage, & DownImage);
  addAndMakeVisible(pCloseButton);
  pCloseButton->setButtonText(tr("Закрыть"));
  pCloseButton->addListener(this);

  setSize (400, 200);
}
//---------------------------------------------------------------------
Листинг 12.5. Реализация конструктора класса компонента содержимого TCentralComponent (файл TCentralComponent.cpp)

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

Как уже отмечалось выше, с помощью ряда классов — потомков DrawableDrawableButton может отображать не только готовые изображения, но и различные графические примитивы. Пример создания сложных кнопок DrawableButton в виде звезд с произвольным числом лучей с использованием класса DrawablePath входит в поставку Juce (см. <каталог Juce>/juce/extras/JuceDemo/Source/demos, файл WidgetsDemo.cpp).

В данном примере DrawableButton легко можно заменить на ShapeButton — кнопку, содержащую залитую геометрическую фигуру (shape). Установить эту фигуру можно с помощью метода void ShapeButton::setShape(const Path& newShape, bool resizeNowToFitThisShape, bool maintainShapeProportions, bool hasDropShadow), где newShape — собственно, рисуемая фигура (объект класса Path), а maintainShapeProportions и hasDropShadow — флаги того, должны ли размеры кнопки подстраиваться под размеры фигуры, и того, должна ли фигура отбрасывать тень, соответственно.

Мы не будем подробно останавливаться на работе с ImageButton, поскольку она сходна с таковой для DrawableButton, разница лишь в использовании объектов класса Image, а не Drawable в методе setImages плюс задание цветов кнопки при манипуляции с ней мышью (наведение и т.п.). Пример использования ImageButton имеется в демонстрационном приложении Juce (см. <каталог Juce>/juce/extras/JuceDemo/Source/demos, файл WidgetsDemo.cpp).

ToolbarItcodeComponent — кнопка инструментальной панели — подробно рассмотрена в "Элементы управления. Компоненты меню" (комоненты панели инструментов).

HyperlinkButton — кнопка, отображающая подчеркнутую гиперссылку на ресурс Web, который запускается в браузере, установленном по умолчанию, при щелчке по ней. Особенностью кнопки является то, что для ее работы не нужен слушатель (ButtonListener), хотя его установка и возможна, например, если вы хотите, чтобы были выполнены какие-либо действия перед переходом по ссылке.

Конструктор класса кнопки с гипертекстовой ссылкой HyperlinkButton::HyperlinkButton(const String& linkText, const URL& linkURL) принимает два параметра: linkText — отображаемый текст и linkURL — собственно гиперссылка, объект специального класса Juce, URL.

Ссылку на ресурс Web можно изменить с помощью метода void HyperlinkButton::setURL(const URL& newURL ) throw().

Как и у любой кнопки, текст HyperlinkButton можно изменить методом setButtonText.

Пример использования HyperlinkButton представлен в листинге 12.6, внешний вид работающей программы показан на рисунке12.6

#include "TCentralComponent.h"
//---------------------------------------------------------------------
#define tr(s) String::fromUTF8(s)
//---------------------------------------------------------------------
TCentralComponent::TCentralComponent() : Component("Central Component"),
                     pHyperlinkButton(0)
{
  // Кнопка с гиперссылкой
  pHyperlinkButton = 
  new HyperlinkButton(L"http://www.rawmaterialsoftware.com/juce.php",
            URL(L"http://www.rawmaterialsoftware.com/juce.php"));
JuceHyperlinkButton  // Устанавливаем текст всплывающей подсказки
  pHyperlinkButton->setTooltip(
                L"http://www.rawmaterialsoftware.com/juce.php");
  addAndMakeVisible(pHyperlinkButton);

  setSize(400, 200);
}
//---------------------------------------------------------------------
TCentralComponent::~TCentralComponent()
{
  // Удаляем дочерний виджет
  // и обнуляем его указатель
  deleteAndZero(pHyperlinkButton);
}
//---------------------------------------------------------------------
void TCentralComponent::paint(Graphics& Canvas)
{
  Canvas.fillAll(Colours::white);
}
//---------------------------------------------------------------------
void TCentralComponent::resized()
{
  pHyperlinkButton->setBounds(15, proportionOfHeight(0.4500f), 
                getWidth() - 15, 25);
}
//---------------------------------------------------------------------
Листинг 12.6. Реализация класса компонента содержимого TCentralComponent (файл TCentralComponent.cpp)
Внешний вид программы с HyperlinkButton

Рис. 12.6. Внешний вид программы с HyperlinkButton

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

В данной лекции нами рассмотрены классы, необходимые для создания кнопок различного вида: кнопок с текстом TextButton, кнопок со стрелкой ArrowButton, кнопок с изображениями (ImageButton, DrawableButton и ShapeButton) и гиперссылки (HyperlinkButton). Базовым классом для всех кнопок является Button.

Упражнение

Напишите игру "Светофор": при нажатии на одну из трех кнопок, расположенных вертикально, она окрашивается в соответствующий цвет (красный, желтый или зеленый), а остальные — в темно-серый.

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

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

< Лекция 11 || Лекция 12: 1234 || Лекция 13 >
Иван Иванов
Иван Иванов
Россия
Александр Тырин
Александр Тырин
Россия