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をフルスクリーンにすると隠れる。