如何加载任意 XRC
How to load arbitrary XRC
我想为 display/debug 我的 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 找出它的名称,以其他方式找到它的名称,或者(最好)在不知道其名称的情况下加载对话框。
仅使用 wxXmlResource
API 无法完成此操作,您确实需要解析 XML 才能找出 XRC 文件中定义的内容。请注意,一般来说,它可以包含 0 个、1 个或多个对话框以及任意数量的其他对象(例如框架、菜单、图标...)。
另请注意,XRC 文件可以包含自定义对象类型,在程序代码中使用自定义 XRC 处理程序加载,如果您想要处理这些,您还需要扫描 XML 文件以找到它们存在并为它们注册一些占位符 XRC 处理程序——当然,它将无法以任何有意义的方式加载它们,但如果没有它,包含此类元素的对话框将根本无法加载。
我想为 display/debug 我的 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 找出它的名称,以其他方式找到它的名称,或者(最好)在不知道其名称的情况下加载对话框。
仅使用 wxXmlResource
API 无法完成此操作,您确实需要解析 XML 才能找出 XRC 文件中定义的内容。请注意,一般来说,它可以包含 0 个、1 个或多个对话框以及任意数量的其他对象(例如框架、菜单、图标...)。
另请注意,XRC 文件可以包含自定义对象类型,在程序代码中使用自定义 XRC 处理程序加载,如果您想要处理这些,您还需要扫描 XML 文件以找到它们存在并为它们注册一些占位符 XRC 处理程序——当然,它将无法以任何有意义的方式加载它们,但如果没有它,包含此类元素的对话框将根本无法加载。