openFrameworks 0.9からGLFWを利用してマルチウィンドウなアプリケーションを作成できるようになった。
examples -> events -> multiWindowExample
に複数画面の例が入っている。やらないといけないことはwindow分ofAppクラスを用意して、
GLFWWindowSettings
に合わせてwindowの設定を記述、createWindow
した後、
window
とofApp
等のルーチンを紐づけ、メインルーチンをぶん回す。
class ofApp : public ofBaseApp{
ofxOscReceiver receiver;
KinectCV kinectcv;
public:
void setup();
void exit();
void update();
void draw();
void keyPressed(int key);
void keyReleased(int key);
void mouseMoved(int x, int y);
void mouseDragged(int x, int y, int button);
void mousePressed(int x, int y, int button);
void mouseReleased(int x, int y, int button);
void windowResized(int w, int h);
void dragEvent(ofDragInfo dragInfo);
void gotMessage(ofMessage msg);
shared_ptr<SecondScreen> secondscreen;
};
class SecondScreen : public ofBaseApp{
public:
void setup (void);
void exit (void);
void update(void);
void draw (void);
void keyPressed (int key);
void keyReleased (int key);
void mouseMoved (int x, int y);
void mouseDragged (int x, int y, int button);
void mousePressed (int x, int y, int button);
void mouseReleased(int x, int y, int button);
void windowResized(int w, int h);
void dragEvent (ofDragInfo dragInfo);
void gotMessage(ofMessage msg);
};
今回は2画面なのでこの2つのクラスを作った。 ここで重要なのは、別のWindowアプリをコントロールする側に
shared_ptr<クラス名> name;
という変数が組み込まれていること。
GLFWWindowSettings
に合わせてWindowの設定を記述ofGLFWWindowSettings settings;
settings.width = 300;
settings.height = 300;
settings.setPosition( ofVec2f(20, 20) );
settings.resizable = true;
shared_ptr<ofappbasewindow> mainwindow = ofCreateWindow(settings);
settings.width = 300;
settings.height = 300;
settings.setPosition( ofVec2f(400, 20) );
settings.resizable = true;
shared_ptr<ofappbasewindow> secondwindow = ofCreateWindow(settings);
サイズや画面を出す位置、リサイズ可能にするかどうかなどの設定をしてWindowを作る。
window
とofApp
等のルーチンを紐づけてメインルーチンを回す
shared_ptr<ofapp> mainApp(new ofApp);
shared_ptr<secondscreen> secondApp(new SecondScreen);
mainApp -> secondscreen = secoundApp;
ofRunApp(mainwindow, mainApp);
ofRunApp(secondwindow, secondApp);
ofRunMainLoop();
もし他のWindowに何か反映させるデータがある場合、先ほど作ったクラス内のshared_ptr
に反映させたい側を渡す。
キー入力関係の関数はフォーカスがあるWindowの関数が呼ばれる。 フォーカスが合っているWindowはバーの色が濃く、閉じるなどのボタンの色が付いている。
各々のWindowを個別の画面でフルスクリーンすることができる。 また、メニューバーは全てのWindowをフルスクリーンにすると隠れる。