移植從最簡單、最小的模塊開始,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()
其它的工作,就是替換部分成員函數的體力活了。
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);