Wxwidget 动态加载资源文件

一.创建自己的资源文件

你可以从一个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文件生成的。


  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值