分类: 网络与安全
2015-05-12 22:04:28
移植从最简单、最小的模块开始,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()
};www.**tx.com
我不喜欢用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()
其它的工作,就是替换部分成员函数的体力活了。
GetWindowText | GetValue |
SetWindowText | SetValue |
SetSel | SetSelection |
GetSafeHwnd | GetHandle |
另外提一笔wxString,很好用,比如他提供了Format函数:
double d = 5.6f;
m_content =wxString::Format(L"%.2f", d);
和类型转换函数:
double d;
m_content.ToDouble(&d);