2017-07-27 65 views
0

使用FLTK,我正在編寫使用多個窗口的桌面應用程序。該應用程序管理打開的窗口的列表,並將其顯示在這些線路的菜單:FLTK:當窗口焦點在MacOS上時的事件

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

現在我想設置勾選最頂層窗口的名稱前面:

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

我一直在安裝一個事件處理程序,只要最上面的窗口發生變化就會被調用。我希望Fl::add_handler(&genericEventHandler);會在焦點發生變化時被調用,但事實並非如此。所以,我的問題是:當我的窗口焦點改變時,我如何得到通知?

回答

2

您應該繼承Fl_Window以覆蓋其處理方法以監視FL_FOCUS和FL_UNFOCUS事件。這裏是一個樣本:

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