Статьи:

Профиль:

Внешний вид ВСТ плагина VST GUI 2.2 — часть 1


Вашему вниманию предоставляется первая часть перевода руководства пользователя по созданию интерфейса и внешнего вида ВСТ плагина (GUI). Бибилиотеки VSTGUI поддерживаются всеми современными операционными системами, также как и сами граффические визуальные интерфейсы плагинов являются кроссплатформенными. В библиотеках описываются различные объекты, вроде регуляторов и кнопок, с помощью которых пользователи могут управлять работой Вашего ВСТ плагина. Вы же можете задавать те процессы, управление которыми доступно пользователю.

В плане кросплатформенности существует одно неудобство — Вам придётся конвертировать Ваши граффические исходники  из одного формата в другой, однака данная проблема быстро решается с помощью  инструментов разработанных специально для этого третьими лицами. Вы можете найти пример плагина использующего VSTGUI в  соответствующей папке СДК библиотеки. Также как и можете скачать файлы с исходным кодом VSTGUI.

Оглавление
Часть 1
Часть 2
Часть 3 — Контроллеры
Часть 4 — Контроллеры

Данный перевод оформлен также как и предыдущие: Названия классов/интерфейсов выделены зелёным, методов (из которых состоят классы) оранжевым, их упоминание в тексте — коричново-фиолетовым.

В данной первой части перевода не объясняется как создавать граффический интерфейс плагина, тут даётся справочная информация о следующих классах:

  • AEffGUIEditor — подготовка плагина (предварительная инициализация).
  • CView — работа с объектами (различные контроллеры: регуляторы, кнопки и т.д.)
  • CViewContainer — работа с контейнерами, содержащими объекты.
  • CFrame — работа с полями / рамками в которые объединяются контейнеры и объекты.

AEffGUIEditor

До версии 2.1 : #include <vstgui.h>

После версии 2.2:

#include <aeffguieditor.h>

class AEffGUIEditor : public AEffEditor ;

Используйте этот класс в качестве родительского класса визуального интерфейса, а не класс AEffEditor. Данный класс включает в себя некоторую пре-инициализацию.

AEffGUIEditor

AEffGUIEditor (AudioEffect *effect);

Пример:

/ * Позволяет использовать изображение в различных частях плагина: */
static CBitmap *background = 0;

MyEditor::ControlsguiEditor (AudioEffect *effect)
    :	AEffGUIEditor (effect)
{
    frame = 0;

    rect.left   = 0;
    rect.top    = 0;
    rect.right  = kBackgroundW;
    rect.bottom = kBackgroundH;

    / * В этом плагине мы решили поместить все изображения в открытую функцию */
}
~AEffGUIEditor

virtual ~AEffGUIEditor ();

setParameter

virtual void setParameter (long index, float value);

Запрашивается из AEffect для обновления значения контроллера.

Пример:

void MyEditor::setParameter (long index,
    float value)
{
    // Тестируем, подсоединён ли плагин
    if (!frame)
        return;

    switch (index)
    {
        case kMyTag:
         if (myControl)
            myControl->setValue (
                effect->getParameter (index)
            );
         if (myDisplay)
            myDisplay->setValue (
                effect->getParameter (index)
            );
         default :
            break;
    }
    // Запрашиваем для того чтобы убедиться в том что график будет обновлён
    postUpdate ();
}
getRect

virtual long getRect (CRect **rect);

Запрашивает размер и место появления прямоугольника (окна плагина).

open

virtual long open (void *ptr);

Хост-программа открывает окно плагина. Заметка: всегда запрашивайте этот метод из самого плагина.

Пример:

long MyEditor::open (void *ptr)
    AEffGUIEditor::open (ptr);

    / * инициализация фонового изображения плагина */
    if (!myBackground)
        myBackground = new CBitmap (
            kBackgroundPixmapID
        );
    else
        myBackground->remember ();
    ...
}

Смотри также метод close.

idle

virtual void idle ();

Пример:

void MyEditor::idle ()
{
    // выполняется для обеспечивания обновления
    AEffGUIEditor::idle ();

    ...
}
draw

virtual void draw (ERect *rect);

wait

void wait (unsigned long ms);

Причём ms задает промежуток времени ожидания в милисекундах.

getTicks

long getTicks ();

Запрашивает текущее время в милисекундах.

doIdleStuff

void doIdleStuff ();

Обратная связь (ответ) хост-программе и запрос функции idle данного класса этого плагина. Частота обновлений производится с частотой между 10 Гц и 20 Гц.

getEffect

AudioEffect *getEffect ();

Запрашивает аудио эффекты, которые прикреплены к данному визуальному интерфейсу.

getVstGuiVersion

long getVstGuiVersion ();

Запрашивает версию библиотеки VSTGUI.

Ответ на запрос: Более поздняя версия возвращает значение превышающее 16 бит, ранняя — меньше 16 бит.

Пример:

int version = getVstGuiVersion ();
int verMaj = (version & 0xFF00) >> 16;
int verMin = (version & 0x00FF);

setKnobMode

virtual long setKnobMode (int val);

Задаёт режим работы кнопки, при этом  val может принимать следующие значения: kCircularMode, kRelativCircularMode, kLinearMode.

getKnobMode

static long getKnobMode ();

Запрашивает режим работы кнопки, поддерживаются те же значения что и в предыдущем методе.

onWheel

virtual bool onWheel (float distance);

Должно быть вызвано если Вы хотите перенаправить эту информацию.

Пример:

long MyPlugEffectX::vendorSpecific (long lArg1,
    long lArg2, void *ptrArg, float floatArg)
{
    if (editor && lArg1 == 'stCA' && lArg2 == 'Whee')
        return editor->onWheel (floatArg)
             == true ? 1 : 0;
    else
        return AudioEffectX::vendorSpecific (
            lArg1, lArg2, ptrArg, floatArg
        );
}
onKeyDown

virtual long onKeyDown (VstKeyCode &keyCode);

Должно быть вызвано если Вы хотите перенаправить эту информацию. Возвращает единицу если событие зафиксировано.

onKeyUp

virtual long onKeyUp (VstKeyCode &keyCode);

Должно быть вызвано если Вы хотите перенаправить эту информацию. Возвращает единицу если событие зафиксировано.

CView

#include <vstgui.h>

class CView;

Родительский класс класса CFrame

CView

CView (CRect &size);

Создаёт новый объект (контроллер).

~CView

virtual ~CView ();

Уничтожает / удаляет объект (контроллер).

redraw

void redraw ();

Заново прорисовывает объект, прикреплённый к полю рамки  (фрейму)

draw

virtual void draw (CDrawContext *context);

drawRect

virtual void drawRect (CDrawContext *pContext, CRect& updateRect);

Рисует определённый прямоугольник внутри поля объекта.

checkUpdate

virtual bool checkUpdate (CRect& updateRect);

Проверяет, нуждается ли прямоугольник / объект в обновлении.

mouse

virtual void mouse (CDrawContext * context, CPoint &where);

Где where задаёт позицию (в пикселях относительно родительского поля) кусора на которой была нажата клавиша мыши.

AEffGUIEditor :

Запрашивает frame ->mouse (x, y).

Обратите также внимание на метод valueChanged класса CControlListener, который запрашивается пи изменении определённого значения.

update

virtual void update (CDrawContext *context);

notify

virtual long notify (CView* sender, const char* message);

Извещение, используется для отправки сообщения от одного объекта другому.

onKeyDown

virtual long onKeyDown (VstKeyCode& keyCode);

Метод запрашивается когда пользователь отпускает клавишу.

onDrop

virtual bool onDrop (void **ptrItems, long nbItems, long type, CPoint &where);

Запрашивается при перетаскивании на объект другого объекта (не обязательно плагина, обычно файлов с жёсткого диска) с помощью мыши.

ptrItems Список перенесённых объектов, зависит от типа:kDropFiles : Строка пути к файлам ( длы ОС Макинтош -FSSpec).
kDropText : Текстовая строка.
nbItems Колличество перенесённых объектов
type Константа от CDropType
where Позиция курсора мышки
return Возвращает ПРАВДУ если объект перенесён.
onWheel

virtual bool onWheel (CDrawContext *pContext, const CPoint &where, float distance);

looseFocus

virtual void looseFocus ();

Объект больше не имеет фокуса.

takeFocus

virtual void takeFocus ();

Объект теперь имеет фокус.

isDirty

virtual bool isDirty ();

Возвращает ПРАВДУ если объект имеет «грязное» (???) значение.

setDirty

virtual void setDirty (const bool val = true);

Задаёт «грязное» значение объекту.

setMouseEnabled

virtual void setMouseEnabled (const bool bEnable = true);

Используется для ограничения действий мышью.

getMouseEnabled

virtual bool getMouseEnabled ();

Запрашивает статус реакции объекта на действие мышью.

setMouseableArea

virtual void setMouseableArea (const CRect &rect)

Возвращает область данного объекта.

hitTest

virtual bool hitTest (const CPoint& where, const long buttons);

Подтверждение нахождения курсора мыши в области заданного объекта.

setTransparency

virtual void setTransparency (bool val);

Задаёт статус прозрачности режима рисования изображения.

getTransparency

virtual bool getTransparency () ;

Возвращает статус прозрачности режима рисования изображения.

getHeight

long getHeight ();

Возвращает высоту объекта.

getWidth

long getWidth ();

Возвращает ширину объекта.

setViewSize

virtual void setViewSize (CRect &rect);

Задаёт размер области, в которую помещается объект.

getViewSize

virtual CRect &getViewSize (CRect&rect);

Запрашивает размер области, в которую помещается объект.

getParent

CFrame *getParent ();

Возвращает родительскую рамку  (фрейм).

setParent

virtual void setParent (CFrame *pParent);

Задаёт родительскую рамку  (фрейм).

setParentView

virtual void setParentView (CView *pParentView);

Задаёт родительский объект

getEditor

virtual void *getEditor ();

Возвращает значение AEffGUIEditor объекта.

removed

virtual bool removed (CView *parent);

Запрашивается когда данный объект удаляется из родительского объекта.

attached

virtual bool attached (CView *view);

Был прикреплён к объекту.

getParentView

CView *getParentView ();

Возващает родительский объект к данному объекту.

forget

virtual void forget ();

Что-то ссылалось на этот объект и больше этого не делает. В этом случае объект удаляется.

remember

virtual void remember ();

Что-то ссылается на данный объект (рефер).

getNbReference

virtual long getNbReference ();

Возвращает колличество объектов, ссылающихся на данный.

CViewContainer

#include <vstgui.h>class CViewContainer : public CView;

Данный класс является своеобразным контейнером CView объектов. Он позволяет манипулировать группой CView объектов.

CViewContainer

CViewContainer (const CRect &size, CFrame *pParent, CBitmap *pBackground = 0);

Фоновое изображение будет прорисовано ранее прорисовки всех производных объектов

size Размер прямоугольника
pParent Родительское поле
pBackground Фоновое изображение
~CViewContainer

virtual ~CViewContainer ();

Удаляет контейнер объекта.

addView

virtual void addView (CView *pView, CRect &mouseableArea, bool mouseEnabled = true);

Добавляет новый объект в контейнер. Обратите внимание на то что все координаты добавляемых объектов должны быть описаны в координатах, относительно данного контейнера ( где ноль — это верхний левый угол контейнера).  pView — добавляемый объект, mouseableArea — координаты объекта,mouseEnabled — режим работы с мышью.

removeView

virtual void removeView (CView *pView);

Удаляет заданный объект.

removeAll

virtual void removeAll ();

Удаляет все объекты.

isChild

virtual bool isChild (CView *pView);

Возвращает ПРАВДУ если данный объект (pView) является производным от контейнера

getNbViews

virtual long getNbViews ();

Возвращает колличество объектов внутри контейнера.

getView

virtual CView *getView (long index);

Возвращает колличество объектов индекса.

setBackgroundColor

virtual void setBackgroundColor (CColor color);

Задаёт фоновый цвет.

getBackgroundColor

virtual CColor getBackgroundColor ();

Запрашивает фоновый цвет.

setBackground

virtual void setBackground (CBitmap *background);

Задаёт фоновое изображение.

getBackground

virtual CBitmap *getBackground ();

Запрашивает фоновое изображение.

setBackgroundOffset

virtual void setBackgroundOffset (const CPoint&p);

Задаёт офсет фонового изображения.

getBackgroundOffset

virtual const CPoint& getBackgroundOffset ();

Запрашивает офсет фонового изображения.

drawBackgroundRect

void drawBackgroundRect (CDrawContext*pContext, CRect& _updateRect);

getCurrentView

CView *getCurrentView ();

Возвращает название объекта над которым расположен указатель мыши.

setMode

virtual void setMode (long val);

Задаёт режим. При этом в val: стандартным значением kNormalUpdate является ноль, kOnlyDirtyUpdate — только «грязные» объекты перерисовываются при обновлении. Смотри также update.

getMode

virtual long getMode ();

Возвращает информацию о текущем режиме работы.

useOffscreen

virtual void useOffscreen ();

removed

virtual bool removed (CView *parent);

Запрашивается при удалении объекта из родительского.

setParent

virtual void setParent (CFrame *pParent);

Задаёт родительскую рамку.

Также в этом класса описываются следующие методы, которые уже были ранее описаны в классе  CView:

notify, draw, drawRect, mouse, onDrop, onWheel, update, hitTest, onKeyDown, onKeyUp, looseFocus, takeFocus, isDirty, setViewSize.

CFrame

#include <vstgui.h>class CFrame : public CView;

Рамка — это объект пользовательского интерфейса, который рисует рамку вокруг других объектов (контроллеров, кнопок и т.д.). Плагин создаёт рамку и после к ней прикрепляет другие объекты.

CFrame

CFrame (CRect &size, void *systemWindow, AEffGUIEditor *editor);

Создаёт прямоугольную рамку.

size размер рамки
systemWindow Инициализируется хост-программой
editor визуальный интерфейс, к которому относится рамка

Пример:

long MyEditor::open (void *ptr)
{
AEffGUIEditor::open (ptr);

CRect size (
0,
0,
myBackgroundPixmap->getWidth (),
myBackgroundPixmap->getHeight ()
);
frame = new CFrame (size, ptr, this);

}

CFrame

CFrame (CRect &size, char *title, AEffGUIEditor *editor, const int style = 0);

Создаёт отображаемую рамку с заданным размером прямоугольника.

size Размер прямоугольной рамки.
title -
editor Визуальный интерфейс, в котором содержится рамка.
style -

Заметка: используйте методы close и open для отображения/спрятывания рамки.

~CFrame

~CFrame ();

Удаление рамки объекта.

open

bool open (CPoint *point = 0);

Открытие  рамки в заданной позиции. Заметка: используйте только со вторым конструктором CFrame.

close

bool close ();

Закрытие данной рамки.Заметка: используйте только со вторым конструктором CFrame.

isOpen

bool isOpen ();

Возвращает ПРАВДУ в случае если рамка / поле  открыто.

draw

void draw (CDrawContext *context);

Запрашивается по мере необходимости нарисовать рамку. Также прорисовываются фоновое изображение и объекты рамки.

drawRect

void drawRect (CDrawContext*pContext, CRect& updateRect);

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

draw

void draw (CView *view = 0);

Рисует заданный объект, прикреплённый к рамке.

mouse

void mouse (CDrawContext *context,
CPoint &where);

Запрашивается в случае двойного щелчка мышью.

onDrop

Смотри класс CView.

onWheel

bool onWheel (CDrawContext *pContext, const CPoint &where, float distance);

onKeyDown

void onKeyUp (VstKeyCode& keyCode);

Пользователь нажал на кнопку.

onKeyUp

void onKeyUp (VstKeyCode& keyCode);

Пользователь отпустил кнопку.

update

void update (CDrawContext *context);

Запрашивается для обновления. Прорисовываются только добавленные объекты, которые имеют изменённые значения.

idle

void idle ();

Запрашивается из ВСТ каждые * мс для обновления содержимого рамки.

doIdleStuff

void doIdleStuff ();

Запрашивает doIdleStuff визуального интерфейса (???)

getTicks

unsigned long getTicks ();

Возвращает системное время.

getKnobMode

long getKnobMode ();

Возвращает режим работы ручки (круговой, относительный круговой, линейный).

getPosition

bool getPosition (int &x, int &y);

Запрашивает позицию окна в которое включена рамка /поле (верхний левый угол окна).

setSize

bool getSize (CRect *rect);

Определяет размер рамки.

setBackground

void setBackground (CBitmap *background);

Задаёт фоновое изображение рамки.

getBackground

CBitmap *getBackground ();

Возвращает фоновое изображение рамки.

addView

virtual bool addView (CView *view);

Добавляет объект в рамку.

removeView

virtual bool removeView (CView *pView, const bool &withForget = false);

Удаляет заданный объект из рамки.

removeAll

virtual bool removeAll (const bool &withForget = true);

Удаляет все объекты из рамки.

isChild

virtual bool isChild (CView *pView);

Проверяет содержится ли pView в рамке.

getNbViews

virtual long getNbViews ();

Возвращает колличество объектов, находящихся внутри рамки.

getView

virtual CView *getView (long index);

Возвращает колличество индексных объектов, находящихся в рамке.

setModalView

bool setModalView (CView *view);

Задаёт объекту модальный тип, обновления не проверяются. Чтобы убрать модельный режим — запросите фунцию с НУЛЁМ (NULL).

getModalView

CView *getModalView ();

Возвращает список модельных объектов рамки.

getSystemWindow

void *getSystemWindow ();

Каждая хост-программа имеет характерное оформление окнон, зависящее от типа операционной системы. Но VSTGUI описывает другой тип платформо-независимых окон. Запрос метода getSystemWindow возвращает указатель на окно которое предоставляется VSTGUI, запрос метода getParentSystemWindow возвращает указатель на окно которое используется хост-программой.

getParentSystemWindow

void *getParentSystemWindow ();

Запрос типа родительского окна.

setParentSystemWindow

void setParentSystemWindow (void *val);

Задаёт родительскому окну ParentSystemWindow значение val.

getEditor

virtual void *getEditor ();

Возвращает указатель на визуальный интерфейс рамки.

setEditView

void setEditView (CView *view);

Задаёт текущий редактируемый объект.

getEditView

CView *getEditView ();

Запрашивает текущий редактируемый объект.

setDropActive

bool setDropActive (bool val);

Область данной рамки будет поддерживать перетаскивание в неё целей/файлов.

isDropActive

bool isDropActive ();

Определяет, возможно ли в область рамки перетаскивать цели/файлы ?

invalidate

void invalidate (const CRect &rect);

Все содержащиеся в рамке объекты становятся «грязными».

setOpenFlag

void setOpenFlag (bool val);

Задаёт ПРАВДУ если поле открыто.

getOpenFlag

bool getOpenFlag ();

Открыто ли поле ?

Вы должны быть залогинены для комментирования.