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

Разработка собственных компонентов

< Лекция 3 || Лекция 4: 12 || Лекция 5 >

Любой компонент (виджет) представляет собой прямоугольную область на экране компьютера, характеризующийся координатами верхне-левого угла, а также длиной и шириной. При изменении размеров главного окна программы (DocumentWindow) автоматически изменяются и размеры компонента содержимого, поэтому заботиться об указании его координат нет необходимости. Однако размеры дочерних виджетов компонента содержимого приходится указывать вручную, переопределяя функцию virtual void Component::resized() ( пример 4.2). Координаты виджетов задаются функцией void Component::setBounds(int x, int y, int width, int height), где x и yкоординаты верхне-левого угла дочернего компонента относительно верхне-левого угла компонента-родителя, а width и height — ширина и высота виджета.

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

Для того, чтобы задать размеры и позицию виджета относительно компонента родителя в Juce используются функции-члены класса Rectangle: getWidth() и getHeight(), возвращающие значения ширины и высоты родительского компонента.

Также можно использовать функции int Component::proportionOfWidth(float proportion) const throw() и int Component::proportionOfHeight(float proportion) const throw(), которые возвращают значения ширины и высоты пропорционально таковым родительского компонента. Так, proportionOfWidth(1.0000f) ( пример 4.2) означает, что ширина дочернего виджета будет соответствовать таковой родительского компонента (аналогично использованию функции getWidth()), а proportionOfHeight(0.9000f) означает, что высота виджета должна составлять 90% высоты родительского компонента.

Теперь добавим экземпляр класса нашего компонента (TCentralComponent) в качестве закрытого члена класса главного окна ( пример 4.3).

#ifndef _TMainForm_h_
#define _TMainForm_h_
//---------------------------------------------------------------------
#include "../JuceLibraryCode/JuceHeader.h"
//---------------------------------------------------------------------
class TCentralComponent;
//---------------------------------------------------------------------
class TMainForm : public DocumentWindow
{
public:
  TMainForm();
  ~TMainForm();

  void closeButtonPressed();
  
private:
  // Компонент содержимого
  TCentralComponent* pCentralComponent;
};
//---------------------------------------------------------------------
#endif
Листинг 4.3. Объявление класса главного окна приложения TMainForm (файл TMainForm.h)

В реализации класса главного окна установим наш компонент в качестве компонента содержимого ( пример 4.4).

#include "TMainForm.h"
//---------------------------------------------------------------------
#include "TCentralComponent.h"
//---------------------------------------------------------------------
TMainForm::TMainForm() : DocumentWindow(
    JUCEApplication::getInstance()->getApplicationName(),
    Colours::azure,
    DocumentWindow::allButtons)
{
  centreWithSize(400, 200);
  setResizable(true, false);
  setVisible(true);
  
  // Динамически создаём экземпляр класса нашего компонента
  pCentralComponent = new TCentralComponent();
  // Устанавливаем его в качестве компонента содержимого
  setContentOwned(pCentralComponent, true);
}
//---------------------------------------------------------------------
TMainForm::~TMainForm()
{
}
//---------------------------------------------------------------------
void TMainForm::closeButtonPressed()
{
  JUCEApplication::getInstance()->systemRequestedQuit();
}
//---------------------------------------------------------------------
Листинг 4.4. Реализация класса главного окна приложения TMainForm (файл TMainForm.cpp)

Внешний вид программы представлен на рисунке 4.1 .

Приложение Juce, использующее в качестве компонента содержимого компонент-контейнер, содержащий ярлык и кнопку

Рис. 4.1. Приложение Juce, использующее в качестве компонента содержимого компонент-контейнер, содержащий ярлык и кнопку

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

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

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

Родительским классом для всех компонентов является Component.

Упражнение

Поэкспериментируйте со свойствами компонентов из примера (размер, цвет).

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

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

< Лекция 3 || Лекция 4: 12 || Лекция 5 >