如何关闭wxWidget中的wxDialog?

How can Close wxDialog in wxWidget?

我花了很多时间研究这个问题如何关闭我从 wxDialog 构建的应用程序 我创建了两个按钮 OK 和 Exit,当我按下 Exit 或签署 App 的 [X] 信号时,我发出此错误

错误图片:

  // The Queue of Event Table

    BEGIN_EVENT_TABLE(AutoPokemonDlg, wxDialog)
    EVT_BUTTON(wxID_OK, AutoPokemonDlg::OnOK)
    EVT_BUTTON(wxID_EXIT, AutoPokemonDlg::OnExit)
    EVT_CLOSE(AutoPokemonDlg::OnCloseWindow)
    END_EVENT_TABLE()


    // I create Event Handler

    void AutoPokemonDlg::OnExit(wxCommandEvent& WXUNUSED(event))
    {
        Close(true);
    }

    void AutoPokemonDlg::OnCloseWindow(wxCloseEvent& WXUNUSED(event))
    {
        Destroy();
    }

    and main Window, i use wxDialog to inherit my subclass is AutoPikachuDlg
    ////AutoPokemonDlg.h
    class AutoPokemonDlg : public wxDialog
    {
    public:
        // Constructor
        AutoPokemonDlg(wxWindow* parent, const wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size);
        ~AutoPokemonDlg();
        // Event handlers
        void OnOK(wxCommandEvent& event);
        void OnExit(wxCommandEvent& WXUNUSED(event));
        void OnCloseWindow(wxCloseEvent& event);

    protected:
    private:
        DECLARE_EVENT_TABLE()
    };

    //////AutoPokemonDlg.cpp
    AutoPokemonDlg::AutoPokemonDlg(wxWindow* parent, const wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size)
        : wxDialog(parent, id, title, pos, size)
    {
    //...
    };

您没有展示如何创建和展示您的 AutoPokemonDlg,但是如果您按照建议在堆栈上进行,例如像这样:

void SomeEventHandler(wxEvent&) {
    AutoPokemonDlg dialog(...);
    dialog.ShowModal();
}

那么您的代码将导致调用 delete &dialog,这显然是错误的,因为这不是堆指针。发生这种情况是因为您从 OnCloseWindow() 处理程序中调用 Destroy() —— 正因为这个原因,它不能用于模态对话框。

最简单的解决方法是完全删除您的 OnCloseWindow() 处理程序,这通常是不必要的,因为如果对话框有任何可用于关闭它的按钮,它无论如何都会关闭,例如 wxID_OKwxID_CANCEL。如果它没有为您自行关闭,可能是因为您在 OnCloseWindow::OnOk() 中做了一些奇怪的事情(您都没有显示)。如果你想让它关闭你的对话框,请从那里调用 EndModal() 来完成。