Россия |
Элементы управления. Кнопки
В случае использования 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, но лишена ее недостатков.
Как уже отмечалось выше, с помощью ряда классов — потомков Drawable — DrawableButton может отображать не только готовые изображения, но и различные графические примитивы. Пример создания сложных кнопок 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)
Краткие итоги
В данной лекции нами рассмотрены классы, необходимые для создания кнопок различного вида: кнопок с текстом TextButton, кнопок со стрелкой ArrowButton, кнопок с изображениями (ImageButton, DrawableButton и ShapeButton) и гиперссылки (HyperlinkButton). Базовым классом для всех кнопок является Button.
Упражнение
Напишите игру "Светофор": при нажатии на одну из трех кнопок, расположенных вертикально, она окрашивается в соответствующий цвет (красный, желтый или зеленый), а остальные — в темно-серый.
Дополнительные материалы
Архив с исходными текстами примеров Вы можете скачать здесь