2017-07-27 13 views
0

FLTKを使用して、複数のウィンドウを使用するデスクトップアプリケーションを作成しています。アプリケーションは、開いているウィンドウのリストを管理し、これらの行とメニューでそれらを示していますFLTK:ウィンドウがMacOSにフォーカスするときのイベント

flags = FL_MENU_TOGGLE|FL_MENU_VALUE; 
menu->add(("&Windows/"+windows[i].name).c_str(), 0, MyMenuCallback, 0, flags); 

for(int i = 0; i < windows.size(); ++i) { 
    menu->add(("&Windows/"+windows[i].name).c_str(), 0, MyMenuCallback); 
} 

は今、私は一番上のウィンドウの名前の前にチェックマークを設定したいです

一番上のウィンドウが変更されたときに呼び出されるイベントハンドラをインストールすることができません。フォーカスが変わるたびにFl::add_handler(&genericEventHandler);が呼び出されることを期待していましたが、そうではありません。だから、私の質問は、私の窓の焦点が変わったとき、どのように通知を受けるのですか?

答えて

2

FL_FOCUSイベントとFL_UNFOCUSイベントを監視するために、そのハンドルメソッドをオーバーライドするには、Fl_Windowをサブクラス化する必要があります。ここにサンプルがあります:

class MyWindow : public Fl_Window { 
public: 
    MyWindow(int X,int Y,int W,int H, const char* title) : Fl_Window (X, Y, W, H, title) {} 

    int handle(int e) { 
     switch(e) { 
      case FL_FOCUS: 
       std::cout << "Window " << label() << " is focused" << std::endl; 
       break; 
      case FL_UNFOCUS: 
       std::cout << "Window " << label() << " has lost focus" << std::endl; 
       break; 
     } 
     return(Fl_Window::handle(e)); 
    } 
}; 

int main() { 
    MyWindow win1(100, 100, 200,200, "Window 1"); 
    win1.show(); 

    MyWindow win2(350, 100, 200,200, "Window 2"); 
    win2.show(); 

    return Fl::run(); 
} 
+0

偉大な答えは、完全に動作します。 – z80crew

関連する問題