注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

多多的爹

 
 
 

日志

 
 

MFC到wxWidgets移植笔记(6)——移植对话框CClauseDlg  

2008-05-09 13:50:02|  分类: 默认分类 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

控件只有简单的三个,下面就是移植对话框了。对话框将近20个 。我找了一个最简单,又具有比较完备功能的对话框ClauseDlg说明一下。

MFC到wxWidgets移植笔记(6)——移植对话框CClauseDlg - dengtao118 - 多多的爹

图片是在Ubuntu下面截的,说老实话,简单的截图然后裁剪一下,Ubuntu还真不是很好用。

这个对话框很简单,新增一个收支项目,除了指定项目名称,还要设定是支出还是收入,最后点击确定增加。

同理,首先将CClauseDlg改成ClauseDlg。下面是类声明:
class ClauseDlg : public wxDialog
{
    DECLARE_EVENT_TABLE()
public:
    ClauseDlg(wxWindow* pParent);
    virtual ~ClauseDlg();
public:
    virtual bool TransferDataToWindow();
    virtual bool TransferDataFromWindow();
protected:
    void CreateControl();
    void OnBnClickedOk(wxCommandEvent& event);
public:
   wxString                m_strClause;
    bool                    m_bin;
};
注:为了在此简单说明,我将成员变量的访问属性改成了public,去掉了get/set函数。
这个类与原MFC类有以下几个不同:
1.基类从CDialog改成wxDialog
2.消息映射表声明从DECLARE_MESSAGE_MAP改成DECLARE_EVENT_TABLE
3.对话框不再使用资源文件,其初始化的所有过程,都在CreateControl函数中。
4.重载TransferDataToWindow和TransferDataFromWindow。这两个函数实现了成员变量与控件的数据同步,类似于MFC的DoDataExchange。

再看看实现:

ClauseDlg::ClauseDlg(wxWindow* pParent)
    :   wxDialog(pParent, wxID_ANY, wxT("收支项目"), wxDefaultPosition)
    ,   m_strClause(wxEmptyString)
    ,   m_bin(false)
{
    CreateControl();
}

ClauseDlg::~ClauseDlg()
{
}

BEGIN_EVENT_TABLE(ClauseDlg, wxDialog)
    EVT_BUTTON(wxID_OK, ClauseDlg::OnBnClickedOk)
END_EVENT_TABLE()

// ClauseDlg message handlers
enum {wxID_TEXT_CLAUSE, wxID_RADIO_OUT, wxID_RADIO_IN};

void ClauseDlg::CreateControl()
{
    wxBoxSizer* clause = new wxBoxSizer(wxHORIZONTAL);
    clause->Add(new wxStaticText(this, wxID_ANY, wxT("收支项目")), 0, wxALIGN_CENTER_VERTICAL | wxRIGHT, 10);
    clause->Add(new wxTextCtrl(this, wxID_TEXT_CLAUSE, m_strClause), 1, wxEXPAND);

    wxBoxSizer* outin = new wxBoxSizer(wxHORIZONTAL);
    outin->Add(new wxRadioButton(this, wxID_RADIO_OUT, wxT("支出"), wxDefaultPosition, wxDefaultSize, wxRB_GROUP), 1, wxEXPAND);
    outin->Add(new wxRadioButton(this, wxID_RADIO_IN, wxT("收入")), 1, wxEXPAND);

    wxStdDialogButtonSizer* button = new wxStdDialogButtonSizer();
    button->AddButton(new wxButton(this, wxID_OK, wxT("确定")));
    button->AddButton(new wxButton(this, wxID_CANCEL, wxT("取消")));
    button->Realize();
    ((wxButton*)FindWindow(wxID_OK))->SetDefault();

    wxBoxSizer* root = new wxBoxSizer(wxVERTICAL);
    root->Add(clause, 0, wxEXPAND | wxALL, 5);
    root->Add(outin, 0, wxEXPAND | wxALL, 5);
    root->Add(button, 0, wxALL, 5);
    SetSizerAndFit(root);
}

void ClauseDlg::OnBnClickedOk(wxCommandEvent&)
{
    if (m_strClause.Length() > 0)
    {
        EndDialog(wxID_OK);
    }
}

bool ClauseDlg::TransferDataToWindow()
{
    ((wxTextCtrl*)FindWindow(wxID_TEXT_CLAUSE))->SetValue(m_strClause);
    ((wxRadioButton*)FindWindow(wxID_RADIO_IN))->SetValue(m_bin);

    return wxDialog::TransferDataToWindow();
}

bool ClauseDlg::TransferDataFromWindow()
{
    m_strClause = ((wxTextCtrl*)FindWindow(wxID_TEXT_CLAUSE))->GetValue();
    ((wxRadioButton*)FindWindow(wxID_RADIO_IN))->GetValue();

    return wxDialog::TransferDataFromWindow();
}
这个实现中包含了很多东西,一点点的来说。

1.构造函数在构造时首先调用了基类的构造函数,并传递了适当的信息。基类的构造函数,实际上已经完成了对话框的创建过程,此时窗口已经被创建出来。不过此时的对话框还是一个光秃秃的东西。然后调用CreateControl来构造对话框的所有控件。

2.在函数CreateControl前,定义了一个enum,它定义了对话框中绑定数据的控件ID。通过FindWindow和这个ID,就能找到控件相对应的类,并对其做相关操作。

3.CreateControl创建控件,同时还构造了一个布局。wxWidgets使用了和Java一样的布局方式,设定好控件的相对位置,加入到BoxSizer中,然后调用SetSizerAndFit,将一切交给BoxSizer来计算他们的实际位置。关于布局的具体说明,参考《使用wxWidgets进行跨平台程序开发》。

4.CreateControl除了可以创建控件,还可以做其它的任何初始化的操作,有点相当于MFC中的OnInitialDlg函数。

5.关闭模式对话框,应该使用EndDialog,并传递一个ID作为参数。外部通过函数ShowModal调用这个对话框的时候,这个ID作用ShowModal的返回值返回。

6.查找控件用FindWindow,找到会返回一个wxWindow的对象指针,可以强制转换成对应的类指针。

7.TransferDataToWindow将成员变量转到窗口控件上,TransferDataFromWindow从窗口控件获得数据。类似于DDX_Control和DDX_Text一类的东西。

8.__super这个关键字好像g++不支持,因此在调用基类的时候,必须明确指出基类的名称。

最后记一笔这个Dialog的用法:

ClauseDlg dlg(this, this);
if (dlg.ShowModal() == wxID_OK)
{
        ...
}

  评论这张
 
阅读(33)| 评论(8)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017