FLTK:窗口聚焦在 MacOS 上时的事件

Posted

技术标签:

【中文标题】FLTK:窗口聚焦在 MacOS 上时的事件【英文标题】:FLTK: Event when a window gets focus on MacOS 【发布时间】:2017-07-27 21:49:14 【问题描述】:

使用 FLTK,我正在编写一个使用多个窗口的桌面应用程序。该应用程序管理一个打开的窗口列表,并在菜单中用这些行显示它们:

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( &amp;genericEventHandler ); 会在焦点发生变化时被调用,但事实并非如此。所以,我的问题是:当我的窗口焦点发生变化时,我如何获得通知?

【问题讨论】:

【参考方案1】:

您应该继承 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:窗口聚焦在 MacOS 上时的事件的主要内容,如果未能解决你的问题,请参考以下文章

Fltk 窗口等待

FLTK 事件映射/多线程

macOS AppKit 的事件响应简介

将键盘事件注入 FLTK 时遇到问题

FLTK:Fl_Value_Input 子类不接收 FL_KEYDOWN 事件(仅 FL_KEYUP)

Web浏览器常用事件