Wxwidget 动态加载资源文件

    xiaoxiao2025-10-16  13

    一.创建自己的资源文件

    你可以从一个xml文件中加载对话框,frame窗口,菜单条,工具条等等。不用c++代码去实现,这符合代码界面和代码分离的原则。 我们可以使用DialogBlocks,XRCed和wxGlade还有wxDesigner工具去绘制我们界面保存在xxx.xrc格式的文件中

    二.加载资源文件

    要使用rXRC文件,在代码中包含wx/xrc/xmlres.h头文件。如果你打算把XRC文件转化成二进制XRS文件使用。在代码中还有增加zip文件系统函数 你可以在Oninit函数添加如下代码: #include ”wx/filesys.h” #include ”wx/fs zip.h” wxFileSystem::AddHandler(new wxZipFSHandler);初始化XRC系统并加载一个XRC文件 在Oninit函数添加如下代码: wxXmlResource::Get()−>InitAllHandlers(); wxXmlResource::Get()−>Load(wxT(”resources.xrc”));

    三.用wxrc翻译XRC文件加载到代码中:

    //例如 wxrc -c -e resource.xrc //执行这条命令后就会产生resource.cpp resource.h 你也可以完全指定翻译文件和函数例如:  wxrc -c -e -n InitAboutDialog Dlg_About.xrc -o dlg_About.cpp 然后你就可以在Oninit函数中添加这个函数的调用 在Oninit函数文件中添加extern void InitAboutDialog(); 在Oninit函数添加InitAboutDialog(); 这2行代码和wxXmlResource::Get()->Load("rc/About.xrc");是等价的。

    四.wxrc 参数

    五,这里写了个小例子供大家参考

    #include "wx/wx.h" #include "wx/image.h" #include "wx/xrc/xmlres.h" //#include "resource.h" // the application icon #if defined(__WXGTK__) || defined(__WXMOTIF__) || defined(__WXMAC__) #include "rc/appicon.xpm" #endif // ---------------------------------------------------------------------------- // private classes // ---------------------------------------------------------------------------- // Define a new application type, each program should derive a class from wxApp class MyApp : public wxApp { public: // override base class virtuals // ---------------------------- // this one is called on application startup and is a good place for the app // initialization (doing it here and not in the ctor allows to have an error // return: if OnInit() returns false, the application terminates) virtual bool OnInit(); }; // Define a new frame type: this is going to be our main frame class MyFrame : public wxFrame { public: // ctor(s) MyFrame(const wxString& title, const wxPoint& pos, const wxSize& size); // event handlers (these functions should _not_ be virtual) void OnQuit(wxCommandEvent& event); void OnAbout(wxCommandEvent& event); void OnDlg1(wxCommandEvent& event); void OnDlg2(wxCommandEvent& event); private: // any class wishing to process wxWidgets events must use this macro DECLARE_EVENT_TABLE() }; // ---------------------------------------------------------------------------- // event tables and other macros for wxWidgets // ---------------------------------------------------------------------------- BEGIN_EVENT_TABLE(MyFrame, wxFrame) EVT_MENU(XRCID("menu_quit"), MyFrame::OnQuit) EVT_MENU(XRCID("menu_about"), MyFrame::OnAbout) EVT_MENU(XRCID("menu_dlg1"), MyFrame::OnDlg1) EVT_MENU(XRCID("menu_dlg2"), MyFrame::OnDlg2) END_EVENT_TABLE() IMPLEMENT_APP(MyApp) // ---------------------------------------------------------------------------- // the application class // ---------------------------------------------------------------------------- extern void InitXmlResource(); // 'Main program' equivalent: the program execution "starts" here bool MyApp::OnInit() { wxImage::AddHandler(new wxGIFHandler); //wxImage::AddHandler(new wxXPMHandler); wxXmlResource::Get()->InitAllHandlers(); //wxXmlResource::Get()->Load("rc/resource.xrc"); InitXmlResource(); MyFrame *frame = new MyFrame("XML resources demo", wxPoint(50, 50), wxSize(450, 340)); frame->Show(true); return true; } // ---------------------------------------------------------------------------- // main frame // ---------------------------------------------------------------------------- // frame constructor MyFrame::MyFrame(const wxString& title, const wxPoint& pos, const wxSize& size) : wxFrame((wxFrame *)NULL, -1, title, pos, size) { SetIcon(wxICON(appicon)); SetMenuBar(wxXmlResource::Get()->LoadMenuBar("mainmenu")); SetToolBar(wxXmlResource::Get()->LoadToolBar(this, "toolbar")); } // event handlers void MyFrame::OnQuit(wxCommandEvent& WXUNUSED(event)) { // true is to force the frame to close Close(true); } void MyFrame::OnAbout(wxCommandEvent& WXUNUSED(event)) { wxString msg; msg.Printf( _T("This is the about dialog of XML resources demo.\n") _T("Welcome to %s"), wxVERSION_STRING); wxMessageBox(msg, "About XML resources demo", wxOK | wxICON_INFORMATION, this); } void MyFrame::OnDlg1(wxCommandEvent& WXUNUSED(event)) { wxDialog dlg; wxXmlResource::Get()->LoadDialog(&dlg, this, "dlg1"); dlg.ShowModal(); } void MyFrame::OnDlg2(wxCommandEvent& WXUNUSED(event)) { wxDialog dlg; wxXmlResource::Get()->LoadDialog(&dlg, this, "dlg2"); dlg.ShowModal(); } 资源文件resource.xrc <?xml version="1.0"?> <resource xmlns="http://www.wxwidgets.org/wxxrc" version="2.3.0.1"> <object class="wxMenuBar" name="mainmenu"> <style>wxMB_DOCKABLE</style> <object class="wxMenu" name="menu_file"> <label>_File</label> <style>wxMENU_TEAROFF</style> <object class="wxMenuItem" name="menu_about"> <label>_About...</label> <bitmap>filesave.gif</bitmap> </object> <object class="separator"/> <object class="wxMenuItem" name="menu_dlg1"> <label>Dialog 1</label> </object> <object class="wxMenuItem" name="menu_dlg2"> <label>Dialog 2</label> </object> <object class="separator"/> <object class="wxMenuItem" name="menu_quit"> <label>E_xit\tAlt-X</label> </object> </object> </object> <object class="wxToolBar" name="toolbar"> <style>wxTB_FLAT|wxTB_DOCKABLE</style> <margins>2,2</margins> <object class="tool" name="menu_open"> <bitmap>fileopen.gif</bitmap> <tooltip>Open catalog</tooltip> </object> <object class="tool" name="menu_save"> <bitmap>filesave.gif</bitmap> <tooltip>Save catalog</tooltip> </object> <object class="tool" name="menu_update"> <bitmap>update.gif</bitmap> <tooltip>Update catalog - synchronize it with sources</tooltip> </object> <separator/> <object class="tool" name="menu_quotes"> <bitmap>quotes.gif</bitmap> <toggle>1</toggle> <tooltip>Display quotes around the string?</tooltip> </object> <object class="separator"/> <object class="tool" name="menu_fuzzy"> <bitmap>fuzzy.gif</bitmap> <tooltip>Toggled if selected string is fuzzy translation</tooltip> <toggle>1</toggle> </object> </object> <object class="wxDialog" name="dlg1"> <object class="wxBoxSizer"> <object class="sizeritem"> <object class="wxBitmapButton"> <bitmap>fuzzy.gif</bitmap> <focus>fileopen.gif</focus> </object> </object> <object class="sizeritem"> <object class="wxPanel"> <object class="wxStaticText"> <label>fdgdfgdfgdfg</label> </object> <style>wxSUNKEN_BORDER</style> </object> <flag>wxALIGN_CENTER</flag> </object> <object class="sizeritem"> <object class="wxButton"> <label>Buttonek</label> </object> <border>10d</border> <flag>wxALL</flag> </object> <object class="sizeritem"> <object class="wxHtmlWindow"> <htmlcode><h1>Hi,</h1>man</htmlcode> <size>100,45d</size> </object> </object> <object class="sizeritem"> <object class="wxNotebook"> <object class="notebookpage"> <object class="wxPanel"> <object class="wxBoxSizer"> <object class="sizeritem"> <object class="wxHtmlWindow"> <htmlcode>Hello, we are inside a <u>NOTEBOOK</u>...</htmlcode> <size>50,50d</size> </object> <option>1</option> </object> </object> </object> <label>Page</label> </object> <object class="notebookpage"> <object class="wxPanel"> <object class="wxBoxSizer"> <object class="sizeritem"> <object class="wxHtmlWindow"> <htmlcode>Hello, we are inside a <u>NOTEBOOK</u>...</htmlcode> <size>50,50d</size> </object> </object> </object> </object> <label>Page 2</label> </object> <usenotebooksizer>1</usenotebooksizer> </object> <flag>wxEXPAND</flag> </object> <orient>wxVERTICAL</orient> </object> </object> <object class="wxDialog" name="dlg2"> <object class="wxBoxSizer"> <orient>wxVERTICAL</orient> <object class="sizeritem" name="dfgdfg"> <object class="wxTextCtrl"> <size>200,200d</size> <style>wxTE_MULTILINE|wxSUNKEN_BORDER</style> <value>Hello, this is an ordinary multiline\n textctrl....</value> </object> <option>1</option> <flag>wxEXPAND|wxALL</flag> <border>10</border> </object> <object class="sizeritem"> <object class="wxBoxSizer"> <object class="sizeritem"> <object class="wxButton" name="wxID_OK"> <label>Ok</label> <default>1</default> </object> </object> <object class="sizeritem"> <object class="wxButton" name="wxID_CANCEL"> <label>Cancel</label> </object> <border>10</border> <flag>wxLEFT</flag> </object> </object> <flag>wxLEFT|wxRIGHT|wxBOTTOM|wxALIGN_RIGHT</flag> <border>10</border> </object> </object> <title>Second testing dialog</title> </object> </resource>我在ubuntu上运行的示例如下: 弹出的窗口和窗口上的图标都是我们动态调运xrc文件生成的。 项目工程代码:http://download.csdn.net/download/bxd1314/9603707
    转载请注明原文地址: https://ju.6miu.com/read-1303201.html
    最新回复(0)