Событие закрытия окна wxwidgets

211
30 января 2018, 10:37
    #include <wx\wx.h>
class Form :public wxApp
{
   wxFrame*window;
public:
   bool OnInit()
   {
      window = new wxFrame(nullptr, -1, "Form", wxPoint(100, 100), wxSize(840, 640));
      window->Centre(wxBOTH);
      window->Show(true);
      return true;
   }
   ~Form()
   {
      wxMessageBox("Bye", "Info");
   }
};
class Win :public wxApp
{
   wxFrame*window;
public:
   bool OnInit()
   {
      window = new wxFrame(nullptr, -1, "hi", wxPoint(100, 100), wxSize(840, 640));

      window->Centre(wxBOTH);
      window->Show(true);
      Form *form = new  Form();
      form->OnInit();
      return true;
   }
   void form_close()
   {
      wxMessageBox("Form closed", "Info");
   }
};
IMPLEMENT_APP(Win);

как отследить закрытие окна Form в Win

Answer 1

Для начала вам надо разобраться какое именно событие вы хотите отследить - закрытие окна (в вашем случае, представленного экземпляром класса wxFrame) или закрытие всего приложения.

Первое имеет тип wxEVT_CLOSE_WINDOW и произойдет при нажатии пользователем на кнопку закрытия или создано программно, после вызова функции Close/1.

Чтобы его обработать можно воспользоваться таблицей событий или с помощью wxEvtHandler::Bind<>(), если ваш компилятор умеет задействовать возможности C++11. Пример:

frame->Bind(wxEVT_CLOSE_WINDOW, [&](wxCloseEvent& event)
    {
    if ( event.CanVeto())
        {
        if ( wxMessageBox("Уверены что хотите закрыть?",
            "Подтвердите действие",
            wxICON_QUESTION | wxYES_NO) != wxYES )
            {
            event.Veto();
            return;
            }
        }
    event.Skip();//вызовет Destroy/0 по-умолчанию  
    });

тоже самое можно сделать и в конструкторе фрейма:

    Bind(wxEVT_CLOSE_WINDOW, [&](wxCloseEvent& event)
        {
        if ( event.CanVeto())
            {
            if ( wxMessageBox("Уверены что хотите закрыть?",
                "Подтвердите действие",
                wxICON_QUESTION | wxYES_NO) != wxYES )
                {
                event.Veto();
                return;
                }
            }
        event.Skip();  
        });

Если про второе, то для выполнения операций при закрытии приложения(оно выполняется автоматически после уничтожения всех окон[речь об обычном GUI приложении]), достаточно перегрузить функцию OnExit/0. При неудачном вызове OnInit/0 функция OnExit/0 не вызывается.

Как обычно, подробности вы можете прочесть в документации(она на английском):

  1. Про события и их обработку - Events and Event Handling
  2. Удаление окон - Window Deletion
  3. Приложения wxWidgets - wxApp

Советую также обратить внимание на примеры из папки samples - они очень полезны.

READ ALSO
Помощь с рекурсией

Помощь с рекурсией

Как запустить данную рекурсию? нужно найтиПремного благодарен!

217
Чтение массива из файла в таблицу с++

Чтение массива из файла в таблицу с++

Из файла нужно считать массив в таблицу, а затем производить манипуляции с этой таблицей:

276
Не могу открыть Db файл в Qt C++

Не могу открыть Db файл в Qt C++

Вот код для подключения Sql Lite файла но не может открыть Db файл в правильном директории

195
не работает тест Cmake&#39;а в CLion

не работает тест Cmake'а в CLion

Здравствуйтедве недели назад столкнулся с проблемой и никак не могу ее решить

233