wxDialog 工作正常,但 wxFileDialog 调用导致程序未终止

wxDialog works fine but a wxFileDialog call results in program not terminating

本文关键字:程序 终止 调用 wxFileDialog 工作 wxDialog      更新时间:2023-10-16

与上次类似的问题。我运行代码,退出它。GUI 消失了,它似乎已完全退出,但我检查了我的进程列表,代码仍然保存着内存。

我已将其缩小到对wxFileDialog的调用。我不明白我做错了什么,因为我调用的方式与调用 wxDialog 的方式非常相似。wxDialog 调用不会导致此问题,但 wxFileDialog 会导致此问题。

工作正常:

// Help Dialog
void MyFrame::OnHelp(wxCommandEvent& WXUNUSED(event))
{
    wxBoxSizer *topsizer;
    wxHtmlWindow *html;
    wxDialog dlg(this, wxID_ANY, wxString(_("Help")));
    topsizer = new wxBoxSizer(wxVERTICAL);
    html = new wxHtmlWindow(&dlg, wxID_ANY, wxDefaultPosition,
    wxSize(380, 160), wxHW_SCROLLBAR_NEVER);
    html->SetBorders(0);
    html->LoadPage(wxT("data/help.html"));
    // Fit the HTML window to the size of its contents
    html->SetSize(html->GetInternalRepresentation()->GetWidth(),
                html->GetInternalRepresentation()->GetHeight());
    topsizer->Add(html, 1, wxALL, 10);
    wxButton *but = new wxButton(&dlg, wxID_OK, _("OK"));
    but->SetDefault();
    topsizer->Add(but, 0, wxALL | wxALIGN_RIGHT, 15);
    dlg.SetSizer(topsizer);
    topsizer->Fit(&dlg);
    dlg.CentreOnParent();
    dlg.ShowModal();
}

原因问题:

void MyFrame::OnVidFile(wxCommandEvent& WXUNUSED(event))
{
    wxString caption = wxT("Choose a file");
    wxString wildcard = wxT("AVI files (*.avi)|*.avi");
    wxString defaultDir = wxGetHomeDir();
    wxString defaultFilename = wxEmptyString;
    wxFileDialog dialog(this, caption, defaultDir, defaultFilename, wildcard, wxOPEN | wxFILE_MUST_EXIST );
    dialog.CentreOnParent();
    if(dialog.ShowModal() == wxID_OK)       // problem
        pathVid = dialog.GetPath().c_str();
}

这会导致程序无法正确终止,即使我抛出一个对话框。销毁(); 或对话框。关闭();在最后。对我来说,它们看起来像对对话类的类似调用?

我在这里错过了什么吗?

问题是与OpenCV(特别是HighGUI)的冲突。

若要避免此问题和 OLE 错误问题,请重写 WxWidgets 初始化基类虚拟,如下所示:

bool MywxApp::Initialize( int& argc, wxChar **argv ) 
{ 
  ::CoUninitialize(); 
  return wxApp::Initialize( argc, argv ); 
}