如何加载任意XRC

时间:2016-10-14 21:19:55

标签: c++ wxwidgets

我想构建一个工具来显示/调试我的XRC文件。我知道有些工具可以做到这一点,但这是一个学习练习,最终会在一个更大的工具中使用。

我正在使用wxFileDialog来选择文件并将名称存储在wxTextControl中。然后在另一个按钮上单击我加载XRC。问题是wxXMLResource.LoadDialog需要加载对话框的名称,对于任意XRC文件我都不知道。

void XRCLoad::ChooseFile(wxCommandEvent& event) {
    wxFileDialog* OpenDialog = new wxFileDialog(
       this, _("Choose a file to open"), 
       wxEmptyString, wxEmptyString, _("Dialog files (*.xrc)|*.xrc"), 
       wxFD_OPEN, wxDefaultPosition);

   if (OpenDialog->ShowModal() == wxID_OK){ 
       ebFile->SetValue( OpenDialog->GetPath()); 
   }

   OpenDialog->Destroy();
}

void XRCLoad::LoadXRC(wxCommandEvent& event)
{
    wxXmlResource::Get()->InitAllHandlers();
    if (wxXmlResource::Get()->LoadFile(ebFile->GetValue())){
        wxDialog dlg;
        wxXmlResource::Get()->LoadDialog(&dlg, this, wxT("XXXXX")); // what should XXXX be?
        dlg.ShowModal();
    }
}

快速浏览wxFormBuilder代码显示它们将文件加载为xml然后解析树,但在这种情况下,他们必须这样做,因为它们正在解构它。在我的情况下,这似乎是不必要的迂回。

我只想显示在文件中找到的对话框,在我的情况下只会有一个。我要么通过检查wxXMLResource找到它的名字,以其他方式找到它的名字,或者(最好)加载对话框而不知道它的名字。

1 个答案:

答案 0 :(得分:1)

仅使用wxXmlResource API无法完成此操作,您确实需要解析XML以找出XRC文件中定义的内容。请注意,一般来说,它可以包含0个,1个或更多个对话框以及任意数量的其他对象(例如框架,菜单,图标......)。

另请注意,XRC文件可以包含自定义对象类型,在程序代码中使用自定义XRC处理程序加载,如果要处理这些类型,还需要扫描XML文件以查找它们并注册一些占位符XRC他们的处理程序 - 当然,它无法以任何有意义的意义加载它们,但如果没有它,包含这些元素的对话框将无法加载。