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


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

  1. こんにちは。いつも大変参考にさせていただいてます。
    今自作しているプラグインで、メインUI上に必要に応じて別のウィンドウを描画(そのウィンドウ描画中はメインUIをグレーアウトさせる)したいのですが、そのような場合もコンテキストメニューの例のように新しくCViewを継承したクラスを作れば良いのでしょうか?

    1. nattou29さん

      お返事遅れました。
      CViewクラスで覆ってしまうというのは一つの手だと思います。

      Windowsだとウィンドウハンドルを取得してウィンドウ自体を操作不能にすることもできた気がします。
      (すいません。ちょっとこのあたりの記憶は曖昧です。 )
      VST GUIのopen()関数の引数parentがウィンドウハンドルだったと思います。

      1. お返事ありがとうございます。
        色々やっていたらCViewでsetAlphaValueなど使ってなんとか実現できそうです。
        そうなのですね、ウィンドウハンドルについても調べてみようと思います
        。 助言いただき感謝です。

コメントを残す