FLTK Закрытие окна - PullRequest
       25

FLTK Закрытие окна

2 голосов
/ 15 ноября 2011

Я использую FLTK.У меня есть окно с множеством кнопок, которые пользователь может нажать, чтобы выполнить какое-либо действие.В моем int main () у меня есть оператор switch для обработки всего этого.Когда пользователь нажимает кнопку выхода, оператор switch настраивается следующим образом:

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

Это относится к функции do_save_exit, которая создает окно подтверждения выхода с двумя кнопками yes (выход) и no (не выход).Я получил кнопку «Да», чтобы выйти из программы, но кнопка «Нет» означает, что я должен просто скрыть окно подтверждения.Это следующие функции:

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 не видит окна выхода (вне области видимости).Как мне поступить?Спасибо

PS: я думал об использовании указателя на окно выхода и последующем использовании указателя для выхода из окна в функции no, но я не уверен, как именно это сделать.

Ответы [ 3 ]

3 голосов
/ 10 августа 2012

Обратный вызов 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 );
3 голосов
/ 15 ноября 2011

Вам, вероятно, нужно взглянуть на модальное окно (то есть диалоговое окно). Посмотрите на <FL/fl_ask.h>

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

В заголовке также есть функции для шрифта всплывающего окна, заголовка и т. Д.

0 голосов
/ 15 ноября 2011

При сборке вы не получаете сообщение об ошибке или предупреждение?Возможно, проблема в том, что у вас есть как глобальные имена функций yes и no, так и локальные переменные, которые называются одинаково.Переименуйте любую из функций переменных.

...