MFC到wxWidgets移植笔

移植从最简单、最小的模块开始,MyMoney中有几个控件类比较独立,首先移植他们。

CDoubleEdit是一个只能输入double的文本控件,其小数位置最多允许两位,在MyMoney中提供金钱输入的功能。

在MFC中,CDoubleEdit从CEdit派生,为响应消息EN_CHANGE,实现了消息函数OnEnChange,当文本控件内容发生改变后,判断是否是合法值,如果不是则恢复成旧值m_content。以下是CDoubleEdit在MFC中的声明:

class CDoubleEdit : public CEdit
{
public:
   CDoubleEdit();
    virtual~CDoubleEdit();

protected:
   DECLARE_MESSAGE_MAP()

public:
    afx_msg voidOnEnChange();

private:
   std::wstring   m_content;
};

wxWidgets提供了一个wxTextCtrl类,这个类相当于CEdit,同样wxWidgets也有消息映射机制,实现了消息函数OnText,响应消息wxEVT_COMMAND_TEXT_UPDATE。以下是CDoubleEdit在wxWidgets中的声明:

class CDoubleEdit : public wxTextCtrl
{
public:
   CDoubleEdit(wxWindow *parent,
       wxWindowID id = wxID_ANY,
       const wxString& value = wxT("0"),
       const wxPoint& pos = wxDefaultPosition,
       const wxSize& size = wxDefaultSize);
    virtual~CDoubleEdit();

public:
    voidOnText(wxCommandEvent& event);

private:
   wxString   m_content;
   DECLARE_EVENT_TABLE()
};

我不喜欢用MFC的CString,所以以前的代码用std::wstring比较多,虽然这种类型也可以跨平台,但wxString似乎更好用一点,因此移植后将所有的std::wstring改成了wxString。

wxWidgets的宏wxT可以根据工程字符集来转换字符串。

wxPoint和wxSize类似于MFC中的CPoint和CSize。

MFC用DECLARE_MESSAGE_MAP()声明消息映射表,wxWidgets中为DECLARE_EVENT_TABLE()。

 

再改cpp文件。将MFC中

BEGIN_MESSAGE_MAP(CDoubleEdit, CEdit)
   ON_CONTROL_REFLECT(EN_CHANGE, OnEnChange)
END_MESSAGE_MAP()

换成适合wxWidgets的

BEGIN_EVENT_TABLE(CDoubleEdit, wxTextCtrl)
   EVT_TEXT(wxID_ANY,CDoubleEdit::OnText)
END_EVENT_TABLE()

其它的工作,就是替换部分成员函数的体力活了。

GetWindowTextGetValue
SetWindowTextSetValue
SetSelSetSelection
GetSafeHwndGetHandle

另外提一笔wxString,很好用,比如他提供了Format函数:

double d = 5.6f;

m_content =wxString::Format(L"%.2f", d);

和类型转换函数:

double d;

m_content.ToDouble(&d);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值