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()

其它的工作,就是替換部分成員函數的體力活了。

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);

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章