VST GUIにおけるコンテキストメニューの実装

VST GUIにおけるコンテキストメニューの実装

VST GUIにおいて右クリックでポップアップするコンテキストメニューを実装する方法を説明いたします。

なお、VST GUIの基本的な作成方法として下記をご理解いただいている前提で進めさせていただきます。

また、コンテキストメニューはCOptionMenuクラスを使用したり、valueChanged()関数でメニュー項目の選択処理などを行うため、「コンボボックスの実装」や「複数コントロールの同期」についても参考にしてください。

CViewクラスの作成

まず、マウスの右クリック操作を受け取るためのクラスをCViewクラスを継承して作成します。
このクラスは背景画像や背景色を設定しないため見た目上は何も表示されないビュー(UI)となります。

【guieditor.h】

【guieditor.cpp】

CMyViewクラスでは、コンストラクタでコンテキストメニュー用のCOptionMenuクラスを作成します。ただし、ここではCOptionMenuクラスの表示をさせません。
また、操作されたときに呼び出されるリスナーをセットしたり、他のコントロールに影響を与えないよう透過状態にしています。

デストラクタでは、コンテキストメニュー用のCOptionMenuクラスをforget()関数で解放しています。

onMouseDown()関数は、CViewクラスの関数をオーバーライドしたもので、コンテキストメニューをポップアップする処理をしています。
マウスのクリックが右クリックが押されたかどうかを確認し、右クリックの場合にCOptionMenuクラスのpopup()関数を呼び出して表示しています。

getContextMenu()関数は他のクラスなどがメンバー変数のcontextMenuを取得するための関数です。
後述するvalueChanged()関数などで使うために定義しています。

VST GUIへの組み込み

CMyViewクラスが実装できれば、実際にVST GUIに組み込みます。

VST GUIクラスのopen()関数内でCMyViewクラスを作成します。
CMyViewクラス作成時にCMyViewクラスのポインタはvalueChanged()関数などで使用するためあらかじめ定義したメンバー変数myViewに保存します。

【guieditor.h】

【guieditor.cpp】

作成時の注意点として、CMyViewクラスをフレームに追加する順番(frame->addView()を行う順番)に注意してください。
CMyViewクラスよりも後に追加されたコントロールについては、そのコントロール上で右クリックを行っても、コンテキストメニューは開きません。
逆にCMyViewクラスよりも前に追加されたコントロールでは、コンテキストメニューが開きますが、コントロール自体に個別のコンテキストメニューがある場合は2重でポップアップウィンドウが開く可能性があります。

コンテキストメニュー操作時の処理

つづいてコンテキストメニューが操作されたときの処理を追加します。
コンテキストメニューのアイテムが選択されるとvalueChanged()関数が呼び出されます。

valueChanged()関数では操作されたコントロールがCMyViewクラスのコンテキストメニューかどうかを確認します。
コンテキストメニューだった場合、どのアイテムが選択されたかを取得し、アイテムに合わせて処理を実施します。

おわりに

以上でコンテキストメニューが実装できます。

上記以外にもVST3.6についての情報があります。下記をご参照ください。

また、質問やご指摘はコメント欄や掲示板Twitterでいただけばとおもいます。

掲示板
■Twitterアカウント:@vstcpp   URL:https://twitter.com/vstcpp


コメントを残す