分享

[wxWidgets][使用wxFormBuilder设计XRC文件快速开发界面]

 herowuking 2014-12-21




场景:

1.wxWidgets是一个优秀的界面库,它的xrc界面布局格式也是很优秀的,可以使用类似mfc的所见即所得的设计方式,我发现它和xcode的interface builder的理念如出一辙。

都是界面与业务分离,界面与业务动态绑定。


2.快速开发小软件时,使用wxFormBuilder来设计好界面,生成XRC文件,当然不想给别人看到xrc文件的内容也可以用工具编译为二进制文件,参考wx.chm文档吧。之后程序载入界面再绑定行为很优雅和高效。wxFormBuilder设计好之后按f5直接看运行效果很赞。

3.博客导出下载工具 就是用wxFormBuilder来设计界面的,xrc文件本身不应该手动编辑,因为它的结构化信息比较多,用软件代为生成就最适合不过了。


文件1: wxFormBuilder生成的xrc文件另存为blog.xrc:


  1. <?xml version="1.0" encoding="UTF-8" standalone="yes" ?>  
  2. <resource xmlns="http://www./wxxrc" version="2.3.0.1">  
  3.     <object class="wxFrame" name="MyFrame1">  
  4.         <style>wxDEFAULT_FRAME_STYLE|wxTAB_TRAVERSAL</style>  
  5.         <size>466,300</size>  
  6.         <bg>#ffffff</bg>  
  7.         <title>博客备份导出(infoworld)</title>  
  8.         <centered>1</centered>  
  9.         <aui_managed>0</aui_managed>  
  10.         <object class="wxBoxSizer">  
  11.             <orient>wxVERTICAL</orient>  
  12.             <object class="spacer">  
  13.                 <option>0</option>  
  14.                 <flag></flag>  
  15.                 <border>5</border>  
  16.                 <size>0,20</size>  
  17.             </object>  
  18.             <object class="sizeritem">  
  19.                 <option>0</option>  
  20.                 <flag>wxEXPAND</flag>  
  21.                 <border>0</border>  
  22.                 <object class="wxBoxSizer">  
  23.                     <orient>wxHORIZONTAL</orient>  
  24.                     <object class="sizeritem">  
  25.                         <option>0</option>  
  26.                         <flag>wxALL</flag>  
  27.                         <border>5</border>  
  28.                         <object class="wxStaticText" name="m_staticText2">  
  29.                             <label>博客网址:</label>  
  30.                             <wrap>-1</wrap>  
  31.                         </object>  
  32.                     </object>  
  33.                     <object class="sizeritem">  
  34.                         <option>1</option>  
  35.                         <flag>wxALL</flag>  
  36.                         <border>5</border>  
  37.                         <object class="wxTextCtrl" name="m_textCtrl1">  
  38.                             <style>wxSIMPLE_BORDER</style>  
  39.                             <value></value>  
  40.                         </object>  
  41.                     </object>  
  42.                     <object class="sizeritem">  
  43.                         <option>0</option>  
  44.                         <flag>wxALL</flag>  
  45.                         <border>5</border>  
  46.                         <object class="wxButton" name="m_button1">  
  47.                             <label>备份</label>  
  48.                             <default>0</default>  
  49.                         </object>  
  50.                     </object>  
  51.                 </object>  
  52.             </object>  
  53.             <object class="sizeritem">  
  54.                 <option>0</option>  
  55.                 <flag>wxEXPAND</flag>  
  56.                 <border>5</border>  
  57.                 <object class="wxBoxSizer">  
  58.                     <orient>wxHORIZONTAL</orient>  
  59.                     <object class="sizeritem">  
  60.                         <option>0</option>  
  61.                         <flag>wxALL</flag>  
  62.                         <border>5</border>  
  63.                         <object class="wxStaticText" name="m_staticText3">  
  64.                             <label>输出目录:</label>  
  65.                             <wrap>-1</wrap>  
  66.                         </object>  
  67.                     </object>  
  68.                     <object class="sizeritem">  
  69.                         <option>1</option>  
  70.                         <flag>wxALL</flag>  
  71.                         <border>5</border>  
  72.                         <object class="wxTextCtrl" name="m_textCtrl6">  
  73.                             <style>wxTE_READONLY|wxSIMPLE_BORDER</style>  
  74.                             <value></value>  
  75.                         </object>  
  76.                     </object>  
  77.                     <object class="sizeritem">  
  78.                         <option>0</option>  
  79.                         <flag>wxALL</flag>  
  80.                         <border>5</border>  
  81.                         <object class="wxButton" name="m_button2">  
  82.                             <label>浏览</label>  
  83.                             <default>0</default>  
  84.                         </object>  
  85.                     </object>  
  86.                 </object>  
  87.             </object>  
  88.             <object class="sizeritem">  
  89.                 <option>0</option>  
  90.                 <flag>wxALL</flag>  
  91.                 <border>5</border>  
  92.                 <object class="wxStaticText" name="m_staticText21">  
  93.                     <label>输出窗口:</label>  
  94.                     <wrap>-1</wrap>  
  95.                 </object>  
  96.             </object>  
  97.             <object class="sizeritem">  
  98.                 <option>1</option>  
  99.                 <flag>wxEXPAND</flag>  
  100.                 <border>5</border>  
  101.                 <object class="wxBoxSizer">  
  102.                     <orient>wxHORIZONTAL</orient>  
  103.                     <object class="sizeritem">  
  104.                         <option>1</option>  
  105.                         <flag>wxALL|wxEXPAND</flag>  
  106.                         <border>5</border>  
  107.                         <object class="wxTextCtrl" name="m_textCtrl2">  
  108.                             <style>wxTE_MULTILINE|wxSIMPLE_BORDER</style>  
  109.                             <size>466,200</size>  
  110.                             <value></value>  
  111.                         </object>  
  112.                     </object>  
  113.                 </object>  
  114.             </object>  
  115.         </object>  
  116.         <object class="wxStatusBar" name="m_statusBar1">  
  117.             <style>wxST_SIZEGRIP</style>  
  118.             <fields>1</fields>  
  119.         </object>  
  120.         <object class="wxMenuBar" name="m_menubar1">  
  121.             <label>MyMenuBar</label>  
  122.             <object class="wxMenu" name="m_menu1">  
  123.                 <label>文件</label>  
  124.                 <object class="wxMenuItem" name="wxID_EXIT">  
  125.                     <label>退出\tAlt+X</label>  
  126.                     <help></help>  
  127.                 </object>  
  128.             </object>  
  129.             <object class="wxMenu" name="m_menu2">  
  130.                 <label>帮助</label>  
  131.                 <object class="wxMenuItem" name="kMenuFeedback">  
  132.                     <label>反馈\tF1</label>  
  133.                     <help></help>  
  134.                 </object>  
  135.             </object>  
  136.         </object>  
  137.     </object>  
  138. </resource>  

文件2:main.cpp调用载入xrc和绑定事件,以下调用python部分可以删除,无关。


  1. bool MyApp::OnInit()  
  2. {  
  3.     if (!wxApp::OnInit())  
  4.     {  
  5.         return false;  
  6.     }  
  7.     Py_Initialize();  
  8.   PyObject* obj = Py_InitModule("redirection", RedirectionMethods);  
  9.   assert(obj);  
  10.   PyRun_SimpleString("\  
  11. import redirection\n\  
  12. import sys\n\  
  13. class StdoutCatcher:\n\  
  14.     def write(self, stuff):\n\  
  15.         redirection.stdoutredirect(stuff)\n\  
  16. sys.stdout = StdoutCatcher()");  
  17.   
  18.   wxInitAllImageHandlers();  
  19.   wxXmlResource::Get()->InitAllHandlers();  
  20.     
  21. //载入Ui目录下的所有xrc文件  
  22.   wxString ui_dir = GetAppRunDirectory()+wxT("/Ui");  
  23.   wxXmlResource::Get()->LoadAllFiles(ui_dir);  
  24.   
  25.   MyFrame *frame = new MyFrame(NULL);  
  26.   bool loaded = wxXmlResource::Get()->LoadFrame(frame, NULL, "MyFrame1");  
  27.   assert(loaded);  
  28.   frame->Init();  
  29.   frame->Show(true);  
  30.   return true;  
  31. }  
  32.   
  33. //1.创建MyFrame之后动态绑定事件  
  34. void MyFrame::Init()  
  35. {  
  36.      backup_button_ =  XRCCTRL(*this, "m_button1", wxButton);  
  37.    backup_button_->Bind(wxEVT_COMMAND_BUTTON_CLICKED,  
  38.         wxCommandEventHandler(MyFrame::OnBackup), this, XRCID("m_button1"));  
  39.    XRCCTRL(*this, "m_button2", wxButton)->Bind(wxEVT_COMMAND_BUTTON_CLICKED,  
  40.         wxCommandEventHandler(MyFrame::OnBrowse), this, XRCID("m_button2"));  
  41.   
  42.      pText_ = XRCCTRL(*this, "m_textCtrl2", wxTextCtrl);  
  43.   
  44.    url_ = XRCCTRL(*this, "m_textCtrl1", wxTextCtrl);  
  45.    output_ = XRCCTRL(*this, "m_textCtrl6", wxTextCtrl);  
  46.   
  47.    Connect(wxXmlResource::GetXRCID(wxT("kMenuFeedback")), wxEVT_COMMAND_MENU_SELECTED,   
  48.     wxCommandEventHandler( MyFrame::OnFeedback ) );  
  49.    Connect(wxXmlResource::GetXRCID(wxT("wxID_EXIT")), wxEVT_COMMAND_MENU_SELECTED,   
  50.     wxCommandEventHandler( MyFrame::OnExit ) );   
  51.   
  52.    wxIcon icon;  
  53.    icon.LoadFile(wxT("blog.ico"),wxBITMAP_TYPE_ICO ,32,32);  
  54.    SetIcon(icon);  
  55.   
  56.    gFrame = this;  
  57. }  

注意:载入xrc后,wx会自动生成一个控件对应的id,这时候用wxXmlResource::GetXRCID(wxT("kMenuFeedback"))通过name来获取id即可。


    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多