MFC与对话框

来源:互联网 发布:unity3d raycasthit 编辑:程序博客网 时间:2024/06/08 04:05

 

一般来说,设计对话框的主要步骤是这样的:

 

 

1、对话框的UI设计。

2、从MFC的CDialog中派生一个类,用来负责对话框的行为。

 

对话框UI的设计这里不再详述。下面主要说说对话框行为的设计。以VS2008为开发环境来描述。

 

首先为对话框关联一个类,此类派生于CDialog,做法是:

1、右键单击对话框,选择“添加类”

2、在界面中,输入类名。可以观察到,在对话框ID上,已经默认为当前选择的对话框ID了。

3、接下来,IDE为我们自动添加了cpp和h文件,以及添加了若干代码。

 

下面我们看看自动添加的代码:

 

// CTestDlg.h

class CTestDlg : public CDialog
{
 DECLARE_DYNAMIC(CTestDlg)

public:
 CTestDlg(CWnd* pParent = NULL);   // 标准构造函数
 virtual ~CTestDlg();

// 对话框数据
 enum { IDD = IDD_DIALOG1 };

protected:
 virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV 支持

 DECLARE_MESSAGE_MAP()
};

 

// CTestDlg.cpp

IMPLEMENT_DYNAMIC(CTestDlg, CDialog)

CTestDlg::CTestDlg(CWnd* pParent /*=NULL*/)
 : CDialog(CTestDlg::IDD, pParent)
{

}

CTestDlg::~CTestDlg()
{
}

void CTestDlg::DoDataExchange(CDataExchange* pDX)
{
 CDialog::DoDataExchange(pDX);
}


BEGIN_MESSAGE_MAP(CTestDlg, CDialog)
END_MESSAGE_MAP()

 

以上代码中,主要产生了这几个东西:

1、Data Map,其中牵涉到 DDX/DDV。

2、Messagemap

3、对话框类

4、函数骨干

 


 

 

DDX:Dialog Data eXchange,就是将对话框上的控件绑定到对话框类的成员变量上,以实现数据的交换。

例如:添加一个编辑框控件,与成员变量m_edit绑定(假设绑定为int类型),此时,在编辑框中输入数字,再通过UpdateData函数进行刷新,就可以将输入的数据交换到m_edit中。

DDV:Dialog Data Validation,就是对于以上交换的数据进行效验。例如:m_edit是表示月份的,范围只能是1~12,这时,就可以设置一个DDV,如输入超出这个范围,则弹出相应的对话框提示。

 

来看一个DDX和DDV的示例:

我们在对话框中添加一个edit控件,ID为IDC_TEST.

接下来右键选择此控件->添加变量->类别:value->变量类型:int->变量名->最小值:1->最大值:12。

设置好之后确定,观察代码,IDE为我们添加了如下代码:

//**.h

int m_test;//变量

//**.cpp

CTestDlg::CTestDlg(CWnd* pParent /*=NULL*/)
 : CDialog(CTestDlg::IDD, pParent)
 , m_test(0)

 

void CTestDlg::DoDataExchange(CDataExchange* pDX)
{
 CDialog::DoDataExchange(pDX);
 DDX_Text(pDX, IDC_TEST, m_test);
 DDV_MinMaxInt(pDX, m_test, 1, 12);

}

可以清楚的看到DDX和DDV实现形式。

 

 

再看看构造函数

CTestDlg::CTestDlg(CWnd* pParent /*=NULL*/)
 : CDialog(CTestDlg::IDD, pParent)
{

}

首先明确,CTestDlg的构造函数会引发CDialog的构造函数,传递两个参数,产生一个模态对话框。两个参数分别是对话框ID和父窗口指针。

其次,CTestDlg::IDD这个参数定义于头文件中, enum { IDD = IDD_DIALOG1 }。这样CTestDlg类就与对话框资源建立了关联。

 


最后看看对话框对控件动作的响应,也就是前面文章对windows消息阐述中的控件消息。

在对话框上,对确定按钮点击右键,选择添加事件处理程序,消息类型选择:BN_CLICKED。这样就添加了一个按钮被点击后的响应函数。

以上操作对程序的影响如下:
//**.h

afx_msg void OnBnClickedOk();

//**.cpp

BEGIN_MESSAGE_MAP(CTestDlg, CDialog)
 ON_BN_CLICKED(IDOK, &CTestDlg::OnBnClickedOk)
END_MESSAGE_MAP()

...

void CTestDlg::OnBnClickedOk()
{//响应函数
}


 

以上就完成了一个对话框类的设计,最后就可以在程序中以此类创建成员变量,并显示。


原创粉丝点击