wxWidgets:使用xrc文件分离界面与代码

wxwidgets支持一种叫xrc的文件,我们可以将字符串,控件,界面布局,图形,放到xrc文件中,程序运行以后再调用这些文件。这就可以在不修改程序的情况下,修改界面,字符串,以及程序中用到的图形,甚至实现i18n(国际化)。

对于标准控件,wxWidgets本身提供了良好的支持,而且可以使用wxformbuilder这个工具来生成xrc文件。


TextFrame.xrc
<?xml version="1.0" encoding="UTF-8"?>
<resource version="2.3.0.1"xmlns="http://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>


wxTextApp.h
#ifndef TEXTFRAME_H_
#define TEXTFRAME_H_

class TextFrame : public wxFrame
{
public:
TextFrame(wxWindow* parent);
virtual ~TextFrame();

void OnSave(wxCommandEvent& event);
public:



private:
DECLARE_EVENT_TABLE()
};

#endif /*TEXTFRAME_H_*/




TextApp.cpp



#include "wx/wx_gch.h"

#include "TextApp.h"
#include "TextFrame.h"

IMPLEMENT_APP(TextApp)


bool TextApp::OnInit()
{
//初始化xrc处理器
wxXmlResource::Get()->InitAllHandlers();
//载入xrc文件
if (!wxXmlResource::Get()->Load(_T("rc/TextFrame.xrc")))
return false;

TextFrame* frame = new TextFrame((wxWindow*)NULL);
frame->Show(true);
return true;
}





TextFrame.h


#ifndef TEXTFRAME_H_
#define TEXTFRAME_H_

class TextFrame : public wxFrame
{
public:
TextFrame(wxWindow* parent);
virtual ~TextFrame();

void OnSave(wxCommandEvent& event);
public:



private:
DECLARE_EVENT_TABLE()
};

#endif /*TEXTFRAME_H_*/



TextFrame.cpp


#include "wx/wx_gch.h"

#include "TextFrame.h"
#include "wx/filedlg.h"



BEGIN_EVENT_TABLE(TextFrame,wxFrame)
EVT_MENU(XRCID("save_menuitem"),TextFrame::OnSave)
END_EVENT_TABLE()

//wxMemoryDC dc; //必须构造wxMemoryDC对象以保证能够调试

TextFrame::TextFrame(wxWindow* parent)
{
//从xrc资源当中初始化本窗口
wxXmlResource::Get()->LoadFrame(this,parent,_T("main_frame"));
}

TextFrame::~TextFrame()
{
}

void TextFrame::OnSave(wxCommandEvent& event)
{
wxFileDialog fd( this,
_T("保存文件"),
_T("."),
_T(""),
_T("txt file(*.txt)|*.txt|all file(*.*)|*.*"),
wxSAVE,
wxDefaultPosition);
if (fd.ShowModal() == wxID_OK)
{
//从xrc资源中找到控件
wxTextCtrl* tc = XRCCTRL(*this,"tc",wxTextCtrl);
tc->SaveFile(fd.GetFilename());
wxMessageBox("保存成功");
}
}

如果对界面美化要求比较高的时候,就不得不自己写控件,自己编写的控件一样可以支持xrc。

自定义控件的十个步骤:

(1)、编写类声明,它应该拥有一个默认构造函数,一个完整构造函数,一个Create函数用于两步创建,最好还有一个Init函数用于初始化内部数据。

(2)、增加一个函数DoGetBestSize,这个函数应该根据内部控件的情况(比如标签尺寸)返回该控件最合适的大小。

(3)、如果已有的事件类不能满足需要,为你的控件增加新的事件类。比如对于内部复杂的一个按钮被按下的事件,可能使用已有的wxCommandEvent就可以了,但是更复杂的控件需要更复杂的事件类。并且如果你增加了新的事件类,也应该增加相应的事件映射宏。

(4)、编写代码在你的新控件上显示信息。

(5)、编写底层鼠标和键盘控制代码,并在其处理函数中产生你自定义的新的事件,以便应用程序可以作出相应处理。

(6)、编写默认事件处理函数,以便控件可以处理那些标准事件(比如处理wxID_COPY或wxID_UNDO等标准命令的事件)或者默认用户界面更新事件。

(7)、可选的增加一个验证器类,以便应用程序可以用它使得数据和控件之间的传输变得容易,并且增加数据校验功能。

8)、可选的增加一个资源处理类,以便可以再XRC文件中使用你自定义的控件。

(9)、在你准备使用的所有平台上测试你的自定义控件。

(10)、编写文档。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值