这里主要是参考VST3.6.5的文档…主要是做一下翻译吧。
主要是英文水平比较烂…看一句忘两句的。惨兮兮的,还是中文好。
前一篇: 【VST】VST3 SDK开发(一) —— 基础概念、处理部分、编辑部分、组件之间的通信.
入门教程,本教程将为您简要介绍如何开始使用VSTGUI.
VST Integration —— VST集成
使用VSTGUI将用户界面添加到VST插件非常简单。
创建一个从 AEffGUIEditor 继承的新类。重载 AEffGUIEditor::open 和 AEffGUIEditor::close 这两个方法.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
class MyEditor : public AEffGUIEditor { public: MyEditor(void* ptr) : AEffGUIEditor(ptr) { } bool open(void* ptr); void close(); }; //In MyEditor::open you create the CFrame. bool MyEditor::open(void* ptr) { CRect frameSize(0, 0, 300, 300); frame = new CFrame(frameSize, ptr, this); return true; } //In MyEditor::close you need to delete the CFrame void MyEditor::close() { delete frame; frame = 0; } |
现在你只需要将VST插件的编辑器设置为MyEditor的新实例。
在VST插件的构造函数某处,进行如下的调用:
1 2 |
// somewhere in the constructor of your VST Plug-In setEditor(new MyEditor(this)); |
这样你就有了自己的VST插件编辑器,现在你需要添加控制。
Adding views and controls —— 添加视图和控件
Loading images —— 加载图片
VSTGUI提供的大多数控件都使用图像。所以你需要知道如何在VSTGUI中加载和使用图像。要加载图像,只需要使用 CBitmap 类。
1 |
CBitmap* bitmap = new CBitmap("MyBitmap.png"); |
图像“MyBitmap.png” 必须在Windows的.rc资源文件中定义,如下所示:
1 |
MyBitmap.png DATA DISCARDABLE“MyBitmap.png” |
MacOS:在Mac OS X上,映像必须位于vst软件包的Resources文件夹中。
Creating views and adding them to the frame —— 创建视图并将其添加到框架
现在我们已经加载了一个图像,我们希望这个图像在我们的编辑器中显示。最简单的方法是使用CView类,它是所有视图和控件类的基础。
1 2 |
CView* myView = new CView(CRect(0, 0, bitmap->getWidth(), bitmap->getHeight())); myView->setBackground(bitmap); |
为了实际显示,我们需要将这个视图添加到前面创建的CFrame对象中。
1 |
frame->addView(myView); |
在设置所有视图之后,我们可以释放我们的图像,因为所有的视图都会自己存储记录自己的图像。
1 |
bitmap->forget(); |
现在让我们看看下面的例子:(这看起来是一个完整的例子)
1 2 3 4 5 6 7 8 9 10 11 |
bool MyEditor::open(void* ptr) { CRect frameSize(0, 0, 300, 300); frame = new CFrame(frameSize, ptr, this); CBitmap* bitmap = new CBitmap("MyBitmap.png"); CView* myView = new CView(CRect(0, 0, bitmap->getWidth(), bitmap->getHeight())); myView->setBackground(bitmap); frame->addView(myView); bitmap->forget(); return true; } |
只有在我们的编辑器中显示的图像有点跛脚。 我们希望有一些用户可以与之交互的控件。
Creating a knob control —— 创建一个旋钮控件
VSTGUI提供了一些可以使用的基本控件。
作为一个例子,我们使用CKnob控件。 CKnob控件需要两个图像,即背景和句柄。背景名称建议始终绘制为此控件的背景,而句柄绘制在此控件值的位置。
有关更多信息可以看文档 VSTGUI::CKnob 部分。
现在让我们看看如何创建这样一个旋钮:
1 |
CKnob* knob = new CKnob(r, 0, 0, background, handle, CPoint(0, 0)); |
正如你所看到的,有一些参数被设置为0,先忽略他们,稍后再谈。
如果将此旋钮添加到框架并测试界面,将看到如果在该控件下按下鼠标并移动鼠标,旋钮的手柄也在转动。
太好了,我们在编辑器里有一些东西可以玩。
完整的例子:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
bool MyEditor::open(void* ptr) { CRect frameSize(0, 0, 300, 300); frame = new CFrame(frameSize, ptr, this); CBitmap* background = new CBitmap("KnobBackground.png"); CBitmap* handle = new CBitmap("KnobHandle.png"); CRect r(0, 0, background->getWidth(), background->getHeight()); CKnob* knob = new CKnob(r, 0, 0, background, handle, CPoint(0, 0)); background->forget(); handle->forget(); frame->addView(knob); return true; } |
Getting notification of control changes —— 获取控件变更的通知
现在我们的编辑器中由一个旋钮,我们想知道用户何时使用此控件。
The CControlListener —— 控件监听器
这是通过 CControlListener 接口完成的。VSTGUI中的每一个控件都可以有一个监听器,当控件的值发生变化时,通知监听器。
首先我们需要一个CControlListener.
最简单的方法是让我们的编辑器同时继承 AEffGUIEditor 和 CControlListener。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
class MyEditor : public AEffGUIEditor, public CControlListener { public: MyEditor(void* ptr) : AEffGUIEditor(ptr) { } // from AEffGUIEditor bool open(void* ptr); void close(); // from CControlListener void valueChanged(CControl* pControl); }; |
接下来我们可以使用我们的编辑器作为CKnob构造函数中的侦听参数。
1 |
CKnob* knob = new CKnob(r, this, 0, background, handle, CPoint(0, 0)); |
然后我们只需要实现ValueChange方法,就可以知道用户何时旋转我们的旋钮。
1 2 3 4 |
void MyEditor::valueChanged(CControl* pControl) { // pControl is our knob in this example } |
Control identification —— 控制标识
使用一个控件的时候,我们可以很容易知道用户使用了哪个控件。
如果在我们的编辑器中有更多的控件,对控件的区分是由 <控件标签> 来完成的。
所有我们添加两个旋钮控件,我们给它不同的<控件标签>。
1 2 |
CKnob* knob1 = new CKnob(r, this, 0, background, handle, CPoint(0, 0)); CKnob* knob2 = new CKnob(r, this, 1, background, handle, CPoint(0, 0)); |
现在在我们的valueChanged方法中,我们可以区分控件:
1 2 3 4 5 6 7 8 9 10 11 12 |
void MyEditor::valueChanged(CControl* pControl) { long tag = pControl->getTag(); if (tag == 0) { // the first knob } else if (tag == 1) { // the second knob } } |
有关完整示例,请参阅VSTGUI附带的教程项目。