2015-01-01 116 views
0

我正在構建一個VST2插件。我想知道什麼時候創建一個插件窗口:在加載DLL(在我的情況下在InitInstance),或其他點(也許AEffEditor::open)?VST2接口dll入口點

我有子類AEffEditor。我在InitInstance中創建了一個窗口,並在AEffEditor::openAEffEditor::close中顯示和隱藏窗口。

看起來InitInstance(DLL負載)是不是創建一個窗口的正確點,但然後呢?

E.g.主機正在爲2個插入實例創建3個窗口(一個加載dll)。

另一個問題:什麼時候是InitInstance(dll負載)調用?在主機啓動和每次發送/插入?

我應該爲每個dll加載創建一個窗口(m_pMainWnd)或在單獨的線程中創建它們並跟蹤窗口?即m_pMainWnd會不同或將是同一個單一窗口?

+0

通過在'open()'中創建一個窗口(如果尚不存在的話)來解決。 – user1288043

回答

0

VST編輯器窗口應該嵌入到主機應用程序窗口中。這意味着您需要一個窗口引用(如果您使用Cockos extensions,則需要窗口引用(Windows上的HWND,Mac上的Mac上的WindowRef或帶有Coco的Mac上的NSView),以便能夠創建窗口。

當調用AEffEditor :: open時,VST API只傳遞該窗口引用。當AEffEditor :: close被調用時它變得無效(即使文檔對它不是很具體)。因此,您需要在AEffEditor :: open(作爲傳遞給您的窗口的子窗口)內創建窗口,並在AEffEditor :: close中將其銷燬。

由此可見,您需要爲每個插件創建一個單獨的窗口實例。用戶可以將插件的多個實例放入不同的軌道,並且他/她預期對其中一個插件的更改不會影響其他插件。

+0

如果'open()'創建窗口(並且'close()'銷燬它),那麼窗口如何保存其數據?我認爲「打開」和「關閉」是爲了顯示和隱藏「現有」窗口,而不是用於創建和銷燬。或者我錯了? – user1288043

+0

@ user1288043 VST插件窗口(「效果編輯器」)反映了您的插件的當前狀態。通常這個狀態將是VST參數。無論如何,您需要保存這些數據以保存,恢復,銀行/預設切換,也許作爲您的插件對象的成員變量。編輯器需要是「啞巴」,任何調整應該更新參數。並且任何不是由GUI調整(如自動化或預設更改)引起的參數更改都需要反映出來。就像經典的模型/視圖模式一樣。 – cyco130