FLTK:window 在 MacOS 上获得焦点时的事件
FLTK: Event when a window gets focus on MacOS
我正在使用 FLTK 编写一个使用多个 windows 的桌面应用程序。该应用程序管理一个打开的 windows 列表,并在菜单中显示这些行:
for( int i = 0; i < windows.size(); ++i ) {
menu->add(("&Windows/"+windows[i].name).c_str(), 0, MyMenuCallback);
}
现在我想在最上面的名字前打勾window:
flags = FL_MENU_TOGGLE|FL_MENU_VALUE;
menu->add(("&Windows/"+windows[i].name).c_str(), 0, MyMenuCallback, 0, flags);
我一直在安装一个事件处理程序,只要最顶层 window 发生变化,该事件处理程序就会被调用。我希望 Fl::add_handler( &genericEventHandler );
会在焦点改变时被调用,但事实并非如此。所以,我的问题是:当我的 windows 的焦点发生变化时,我如何得到通知?
您应该子类化 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();
}
我正在使用 FLTK 编写一个使用多个 windows 的桌面应用程序。该应用程序管理一个打开的 windows 列表,并在菜单中显示这些行:
for( int i = 0; i < windows.size(); ++i ) {
menu->add(("&Windows/"+windows[i].name).c_str(), 0, MyMenuCallback);
}
现在我想在最上面的名字前打勾window:
flags = FL_MENU_TOGGLE|FL_MENU_VALUE;
menu->add(("&Windows/"+windows[i].name).c_str(), 0, MyMenuCallback, 0, flags);
我一直在安装一个事件处理程序,只要最顶层 window 发生变化,该事件处理程序就会被调用。我希望 Fl::add_handler( &genericEventHandler );
会在焦点改变时被调用,但事实并非如此。所以,我的问题是:当我的 windows 的焦点发生变化时,我如何得到通知?
您应该子类化 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();
}