openFrameworks

openFrameworksでマルチウィンドウ、マルチディスプレイの実装方法

More than 1 year has passed since last update.

当記事は、macOS 10.12.5 ,openFrameworks 0.9.8,Xcode8.3.3の開発環境を想定したものとなります。
尚、こちらの記事を参考にしています。

マルチウィンドウを実装するには

こちらについてはoFが提供している以下のexampleを参考にすることで実装できます。
・events/multiWindowExample
・events/multiWindowOneAppExample
具体的に記述すると以下のようになります。

main.cpp
int main( ){
    ofGLFWWindowSettings settings;

    //メインウィンドウの情報を記述
    //ウィンドウの幅、高さ
    settings.width = 500;
    settings.height = 900;
    //ウィンドウを表示する座標(左上の座標を指定)
    settings.setPosition(ofVec2f(0,0));
    shared_ptr<ofAppBaseWindow> mainWindow = ofCreateWindow(settings);

    //サブウィンドウの情報を記述
    settings.width = 700;
    settings.height = 800;
    settings.setPosition(ofVec2f(ofGetWidth()/2,0));
    shared_ptr<ofAppBaseWindow> subWindow = ofCreateWindow(settings);

    //Appの生成
    shared_ptr<ofApp> mainApp(new ofApp);
    shared_ptr<SubApp> subApp(new SubApp);
    ofRunApp(mainWindow,mainApp);
    ofRunApp(subWindow,subApp);

    ofRunMainLoop();
}    

ここで使用しているSubAppクラスはofBaseAppを継承したクラスを新たに作成したものです。こちらを実行すると、2つのウィンドウが表示されるはずです。SubAppクラスのincludeを忘れずに。

マルチディスプレイの実装方法

こちらについてもofGLFWWindowSettingsのインスタンスのプロパティを変更することで実現できます。また、それぞれのウィンドウをフルスクリーンにしたかったのですが、色々ハマったので備忘録として残しておきます。

main.cpp
    ofGLFWWindowSettings settings;

    //メインウィンドウの情報を記述
    //ウィンドウの幅、高さを画面サイズに合わせる
    settings.width = 1440;
    settings.height = 900;
    //ウィンドウを表示する座標(左上の座標を指定)
    settings.setPosition(ofVec2f(0,0));
    shared_ptr<ofAppBaseWindow> mainWindow = ofCreateWindow(settings);

    //サブウィンドウの情報を記述
    settings.width = 1440;
    settings.height = 900;
    //ウィンドウを表示する座標
    settings.setPosition(ofVec2f(1440,0));
    shared_ptr<ofAppBaseWindow> subWindow = ofCreateWindow(settings);

先程のコードとの相違点は2つです。
・ウィンドウのサイズをディスプレイと同じサイズにすること。
・サブウィンドウの表示位置をメインウィンドウとサブウィンドウの境に設定したこと。

1つ目の変更についてはサブウィンドウ側も表示したいディスプレイと同じサイズにする必要があります。ちなみにofSetFullScreenなどを用いてフルスクリーンにしようとすると、座標の設定が無効となってしまうのか、全てメインディスプレイで表示されるようになってしまうのでご注意ください。
2つ目については、サブウィンドウが少しでもメインディスプレイの表示域に入ってしまうとメインディスプレイで表示されてしまうので、このような対応が必要です。座標は定数化しておくと後々わかりやすいかもしれません。

ofGLFWWindowSettingsのプロパティ

最後にその他ofGLFWWindowSettingsのプロパティが持つ意味を一部のみではありますが紹介いたします。筆者もまだまだ調査中ですのでご了承ください。

decorated :
bool型のプロパティ。trueにするとメニューバーが表示され、falseにすると非表示になるようです。上記で実装したウィンドウは擬似的なフルスクリーンのため、メニューバーが表示されており残念でしたが、こちらをfalseにすると非表示にすることができました!

multiMonitorFullScreen : 
同じくbool型のプロパティ。trueを指定するとディスプレイ間を跨いでウィンドウを表示できるようになります。例えば、ウィンドウの左半分がメインディスプレイ、右半分がサブディスプレイに投影されるといったようになるようです。