FLTK关闭窗口

时间:2011-11-15 04:30:49

标签: c++ user-interface window fltk

我正在使用FLTK。我有一个窗口,其中包含各种按钮,用户可以单击这些按钮执行某些操作。在我的int main()中,我有一个switch语句来处理所有这些。当用户单击exit时,switch语句的设置如下:

case Exit_program:
    cout << "save files and exit\n";
    do_save_exit(sw);

这将转到do_save_exit函数,该函数创建一个退出确认窗口,其中包含两个按钮yes(退出)和no(不退出)。我得到了yes按钮,退出程序,但是没有按钮意味着我应该隐藏确认窗口。这是以下功能:

void yes(Address addr, Address)
{
    exit(0);
}
void no(Address addr, Address)
{

}
void do_save_exit(Window& w)
{
    Window quit(Point(w.x()+100, w.y()+100), 250, 55, "Exit confirmation");
    Text conf(Point(15,15),"Do you really want to save and exit?");
    Button yes(Point(60, 20),35,30,"Yes",yes);
    Button no(Point(140, 20),35,30,"No",no);
    quit.attach(conf);
    quit.attach(yes);
    quit.attach(no);
    wait_for_main_window_click();
}

问题是,当我点击“否”按钮时,它会变为无效,但我无法从那里去任何地方。我只想做quit.hide()但是no函数没有看到退出窗口(超出范围)。我该怎么办?谢谢

P.S:我已经考虑过使用指向退出窗口的指针然后使用指针在no函数中退出窗口,但我不确定如何准确地执行此操作。

4 个答案:

答案 0 :(得分:3)

您可能需要查看使用模态(即对话框)窗口。看看<FL/fl_ask.h>

if (fl_ask("Do you really want to save and exit?"))
    save_and_exit();

标题还包含弹出窗口的字体,标题等功能。

答案 1 :(得分:3)

尝试关闭窗口时会调用 Fl_Window 回调。默认回调会隐藏窗口(如果所有窗口都被隐藏,则应用程序结束)。如果您设置自己的窗口回调,则可以覆盖此行为,以免隐藏窗口:

// This window callback allows the user to save & exit, don't save, or cancel.
static void window_cb (Fl_Widget *widget, void *) 
{
    Fl_Window *window = (Fl_Window *)widget;

    // fl_choice presents a modal dialog window with up to three choices.
    int result = fl_choice("Do you want to save before quitting?", 
                           "Don't Save",  // 0
                           "Save",        // 1
                           "Cancel"       // 2
                           );
    if (result == 0) {  // Close without saving
        window->hide();
    } else if (result == 1) {  // Save and close
        save();
        window->hide();
    } else if (result == 2) {  // Cancel / don't close
        // don't do anything
    }
}

在设置 Fl_Window 的任何地方设置窗口的回调,例如在主要功能中:

window->callback( win_cb );

答案 2 :(得分:0)

构建时,您不会收到错误或警告?问题可能是你有全局函数名yesno以及同样调用的局部变量。重命名变量的函数。

答案 3 :(得分:0)

无需使用hide()。 您只需在回调中使用exit(0);