Chinaunix首页 | 论坛 | 博客
  • 博客访问: 275556
  • 博文数量: 81
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 878
  • 用 户 组: 普通用户
  • 注册时间: 2014-07-25 23:20
文章分类

全部博文(81)

文章存档

2017年(45)

2016年(20)

2015年(2)

2014年(14)

我的朋友

分类: 网络与安全

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

阅读(2067) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~