
场景:
1.wxWidgets是一个优秀的界面库,它的xrc界面布局格式也是很优秀的,可以使用类似mfc的所见即所得的设计方式,我发现它和xcode的interface builder的理念如出一辙。
都是界面与业务分离,界面与业务动态绑定。
2.快速开发小软件时,使用wxFormBuilder来设计好界面,生成XRC文件,当然不想给别人看到xrc文件的内容也可以用工具编译为二进制文件,参考wx.chm文档吧。之后程序载入界面再绑定行为很优雅和高效。wxFormBuilder设计好之后按f5直接看运行效果很赞。
3.博客导出下载工具 就是用wxFormBuilder来设计界面的,xrc文件本身不应该手动编辑,因为它的结构化信息比较多,用软件代为生成就最适合不过了。
文件1: wxFormBuilder生成的xrc文件另存为blog.xrc:
文件2:main.cpp调用载入xrc和绑定事件,以下调用python部分可以删除,无关。
- bool MyApp::OnInit()
- {
- if (!wxApp::OnInit())
- {
- return false;
- }
- Py_Initialize();
- PyObject* obj = Py_InitModule("redirection", RedirectionMethods);
- assert(obj);
- PyRun_SimpleString("\
- import redirection\n\
- import sys\n\
- class StdoutCatcher:\n\
- def write(self, stuff):\n\
- redirection.stdoutredirect(stuff)\n\
- sys.stdout = StdoutCatcher()");
-
- wxInitAllImageHandlers();
- wxXmlResource::Get()->InitAllHandlers();
-
- //载入Ui目录下的所有xrc文件
- wxString ui_dir = GetAppRunDirectory()+wxT("/Ui");
- wxXmlResource::Get()->LoadAllFiles(ui_dir);
-
- MyFrame *frame = new MyFrame(NULL);
- bool loaded = wxXmlResource::Get()->LoadFrame(frame, NULL, "MyFrame1");
- assert(loaded);
- frame->Init();
- frame->Show(true);
- return true;
- }
-
- //1.创建MyFrame之后动态绑定事件
- void MyFrame::Init()
- {
- backup_button_ = XRCCTRL(*this, "m_button1", wxButton);
- backup_button_->Bind(wxEVT_COMMAND_BUTTON_CLICKED,
- wxCommandEventHandler(MyFrame::OnBackup), this, XRCID("m_button1"));
- XRCCTRL(*this, "m_button2", wxButton)->Bind(wxEVT_COMMAND_BUTTON_CLICKED,
- wxCommandEventHandler(MyFrame::OnBrowse), this, XRCID("m_button2"));
-
- pText_ = XRCCTRL(*this, "m_textCtrl2", wxTextCtrl);
-
- url_ = XRCCTRL(*this, "m_textCtrl1", wxTextCtrl);
- output_ = XRCCTRL(*this, "m_textCtrl6", wxTextCtrl);
-
- Connect(wxXmlResource::GetXRCID(wxT("kMenuFeedback")), wxEVT_COMMAND_MENU_SELECTED,
- wxCommandEventHandler( MyFrame::OnFeedback ) );
- Connect(wxXmlResource::GetXRCID(wxT("wxID_EXIT")), wxEVT_COMMAND_MENU_SELECTED,
- wxCommandEventHandler( MyFrame::OnExit ) );
-
- wxIcon icon;
- icon.LoadFile(wxT("blog.ico"),wxBITMAP_TYPE_ICO ,32,32);
- SetIcon(icon);
-
- gFrame = this;
- }
注意:载入xrc后,wx会自动生成一个控件对应的id,这时候用wxXmlResource::GetXRCID(wxT("kMenuFeedback"))通过name来获取id即可。
|