【问题标题】:What is the right way to close a frame in wxWidgets在 wxWidgets 中关闭框架的正确方法是什么
【发布时间】:2021-02-18 08:52:26
【问题描述】:

我创建了一个应用程序,它的 ShellFromFBFrame 继承自 wxFrame 窗口。

App对象定义如下:

bool ShellFromFBApp::OnInit()
{
//(*AppInitialize
bool wxsOK = true;
wxInitAllImageHandlers();
if ( wxsOK )
{
ShellFromFBFrame* Frame = new ShellFromFBFrame(0);
Frame->Show();
}
//*)
return wxsOK;

}

The ShellFromFBFrame is as follows:

ShellFromFBFrame::ShellFromFBFrame(wxWindow* parent,wxWindowID id)
{
//(*Initialize(ShellFromFBFrame)
wxBoxSizer* MainSizer;
wxBoxSizer* mainContentSizer;
wxMenu* createContact;
...


the ShellFromFBFrame opens a new CreateContactFrame:

void ShellFromFBFrame::OnCreateContact(wxCommandEvent& event)
{
CreateContactFrame* createContactFrame = new CreateContactFrame(NULL,wxID_ANY);
createContactFrame->Show(true);
}


The CreateContactFrame is as follows:


CreateContactFrame::CreateContactFrame(wxWindow* parent,wxWindowID id)
{
//ctor
Create(parent, id, wxT("Create Contact"), wxDefaultPosition, wxSize(1100,700), wxDEFAULT_FRAME_STYLE, _T("id"));
// int num;
// num = wxAtoi(row);
//this->rowToFetch = row;
...

BEGIN_EVENT_TABLE(CreateContactFrame, wxFrame)
EVT_BUTTON(ID_CREATEBTN, CreateContactFrame::CreateContact)
END_EVENT_TABLE()

但是当我通过关闭按钮或取消按钮关闭 CreateContactFrame 窗口时。我的应用程序崩溃,我在构建日志中收到以下进程终止错误消息:

Process terminated with status -1073740940 (0 minute(s), 12 second(s))

我做错了什么?

【问题讨论】:

    标签: wxwidgets


    【解决方案1】:

    由于无限递归,您正在遇到堆栈溢出(多么主题!):您的 wxEVT_CLOSE 处理程序调用 Close() 导致生成另一个 wxEVT_CLOSE 等等。如果您无事可做,只需完全删除处理程序即可解决问题。

    此外,当遇到可重现的崩溃时,首先要做的是使用调试信息构建程序,在调试器下运行它并查看崩溃时的堆栈——在 90% 的情况下,这将为您提供有了答案,当您在堆栈中看到对您的 OnClose() 的无休止重复调用时,肯定会出现这种情况。

    【讨论】:

    • 我可以隐藏窗口,但我无法关闭窗口。就像你说的,我已经删除了 EVT_CLOSE 事件,但是析构函数被无限递归地调用。
    • 我不明白 dtor 怎么可能被调用不止一个,除非你在其中做了一些你没有在这里展示的事情。关于在调试器中查看堆栈跟踪的建议仍然有效。
    • 问题在于我构建 wxwidgets 的方式。我现在已经用 Visual Studio 编译了这个项目。现在该应用程序运行良好。使用 mingw 编译的方式存在问题。app 可以正常使用 vs。谢谢。
    【解决方案2】:

    这不是编码问题,而是 wxwidgets 库的构建。适用于 MSVC 2019。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-04-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多