XRC (XML-based Resource System) 允許將界面佈局、字符串、圖標等資源外部化為 XML 文件。運行時動態加載,實現:
<?xml version="1.0" encoding="UTF-8"?>
<resource version="2.3.0.1" xmlns="https://www.wxwidgets.org/wxxrc">
<object class="wxFrame" name="main_frame">
<title>TextDemo</title>
<object class="wxMenuBar" name="main_menu">
<object class="wxMenu" name="file_menu">
<label>_File</label>
<object class="wxMenuItem" name="save_menuitem">
<label>_Save</label>
</object>
</object>
</object>
<object class="wxTextCtrl" name="tc">
<style>wxTE_MULTILINE</style>
</object>
</object>
</resource>
bool TextApp::OnInit() {
wxXmlResource::Get()->InitAllHandlers(); // 初始化處理器
if (!wxXmlResource::Get()->Load(_T("rc/TextFrame.xrc"))) return false;
TextFrame* frame = new TextFrame(NULL);
frame->Show(true);
return true;
}
TextFrame::TextFrame(wxWindow* parent) {
wxXmlResource::Get()->LoadFrame(this, parent, _T("main_frame"));
}
BEGIN_EVENT_TABLE(TextFrame, wxFrame)
EVT_MENU(XRCID("save_menuitem"), TextFrame::OnSave)
END_EVENT_TABLE()
void TextFrame::OnSave(wxCommandEvent& event) {
wxFileDialog fd(this, _T("保存文件"), _T("."), _T(""),
_T("txt file(*.txt)|*.txt|all file(*.*)|*.*"), wxSAVE);
if (fd.ShowModal() == wxID_OK) {
wxTextCtrl* tc = XRCCTRL(*this, "tc", wxTextCtrl); // 通過名字獲取控件
tc->SaveFile(fd.GetFilename());
wxMessageBox("保存成功");
}
}
XRCID("name"):將字符串 ID 轉換為整數 ID,用於事件表XRCCTRL(parent, "name", Class):運行時查找控件並轉型wxXmlResource::Get()->LoadFrame/LoadDialog/LoadPanel:加載頂層窗口Create()、初始化 Init()DoGetBestSize() 返回建議尺寸OnPaint 等)wxXmlResourceHandler,實現 DoCreateResource(),註冊 wxXmlResource::Get()->AddHandler()class MyCtrlXmlHandler : public wxXmlResourceHandler {
DECLARE_DYNAMIC_CLASS(MyCtrlXmlHandler)
public:
MyCtrlXmlHandler() { XRC_ADD_STYLE(wxBORDER_SIMPLE); }
virtual wxObject* DoCreateResource() {
MyCtrl* ctrl = new MyCtrl;
CreateCtrl(ctrl); // 設置屬性、綁定事件等
return ctrl;
}
virtual bool CanHandle(wxXmlNode* node) {
return IsOfClass(node, "MyCtrl");
}
};
IMPLEMENT_DYNAMIC_CLASS(MyCtrlXmlHandler, wxXmlResourceHandler)
// 應用啟動時註冊
wxXmlResource::Get()->AddHandler(new MyCtrlXmlHandler);
XRC 是 wxWidgets 實現界面與邏輯解耦的核心機制。標準控件配合 wxFormBuilder 可視化設計極其高效;自定義控件通過實現 XmlResourceHandler 即可無縫集成,構建可維護、可本地化的專業級 GUI 應用。