当記事は、macOS 10.12.5 ,openFrameworks 0.9.8,Xcode8.3.3の開発環境を想定したものとなります。
尚、こちらの記事を参考にしています。
マルチウィンドウを実装するには
こちらについてはoFが提供している以下のexampleを参考にすることで実装できます。
・events/multiWindowExample
・events/multiWindowOneAppExample
具体的に記述すると以下のようになります。
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
のインスタンスのプロパティを変更することで実現できます。また、それぞれのウィンドウをフルスクリーンにしたかったのですが、色々ハマったので備忘録として残しておきます。
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を指定するとディスプレイ間を跨いでウィンドウを表示できるようになります。例えば、ウィンドウの左半分がメインディスプレイ、右半分がサブディスプレイに投影されるといったようになるようです。