2017-07-27 4 views
0

Mit FLTK schreibe ich eine Desktop-Anwendung, die mehrere Fenster verwendet. Die Anwendung verwaltet eine Liste der offenen Fenster und zeigt sie im Menü mit diesen Zeilen:FLTK: Ereignis, wenn ein Fenster auf MacOS fokussiert wird

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

Jetzt möchte ich ein Häkchen vor dem Namen des obersten Fensters setzen:

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

Ich bin bei der Installation eines Event-Handlers fest, der immer dann aufgerufen wird, wenn sich das oberste Fenster ändert. Ich hatte gehofft, Fl::add_handler(&genericEventHandler); würde aufgerufen werden, wenn sich der Fokus ändert, aber das ist nicht der Fall. Meine Frage ist also: Wie werde ich benachrichtigt, wenn sich der Fokus meiner Fenster ändert?

Antwort

2

Sie sollten eine Unterklasse von Fl_Window erstellen, um die Handle-Methode zu überschreiben, um FL_FOCUS- und FL_UNFOCUS-Ereignisse zu überwachen. Hier ist ein Beispiel:

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

Große Antwort, funktioniert perfekt. – z80crew

Verwandte Themen