实现:前两个编辑框输入一个数字,单击Add按钮,求和结果显示在第三个编辑框中。首先把Add按钮下面的消息响应函数的代码去掉。
第一种方式:
利用GetWindowText和SetWindowText函数。
void CTestDlg::OnBtnAdd()
{
// TODO: Add your control notification handler code here
int num1,num2,num3;
char ch1[10],ch2[10],ch3[10];
GetDlgItem(IDC_EDIT1)->GetWindowText(ch1,10);
GetDlgItem(IDC_EDIT2)->GetWindowText(ch2,10);
num1=atoi(ch1);
num2=atoi(ch2);
num3=num1+num2;
itoa(num3,ch3,10);
GetDlgItem(IDC_EDIT3)->SetWindowText(ch3);
}
atoi将数字组成的字符串转变成数值,itoa则相反。
第二种方式:
CWnd类还提供了另一个成员函数:GetDlgItemText,把GetDlgItem和GetWindowText结合起来了。用来返回指定ID控件上的文本。同时还有SetDlgItemText用来设定指定ID控件上的文本。
void CTestDlg::OnBtnAdd()
{
// TODO: Add your control notification handler code here
int num1,num2,num3;
char ch1[10],ch2[10],ch3[10];
GetDlgItemText(IDC_EDIT1,ch1,10);
GetDlgItemText(IDC_EDIT2,ch2,10);
num1=atoi(ch1);
num2=atoi(ch2);
num3=num1+num2;
itoa(num3,ch3,10);
SetDlgItemText(IDC_EDIT3,ch3);
}
第三种方式:
CWnd类还提供了另一个成员函数:GetDlgItemInt,用来返回指定ID控件上的文本,并将其转换成一个整型数值。同时还有SetDlgItemInt用来设定指定ID控件上的文本,将整型数值转换成字符串。
void CTestDlg::OnBtnAdd()
{
// TODO: Add your control notification handler code here
int num1,num2,num3;
num1=GetDlgItemInt(IDC_EDIT1);
num2=GetDlgItemInt(IDC_EDIT2);
num3=num1+num2;
SetDlgItemInt(IDC_EDIT3,num3);
}
第四种方式:
将三个编辑框与对话框类的三个成员变量相关联,然后利用这些变量来检索和设置编辑框的文本。
对话框控件与对话框类成员变量相关联:
ClassWizard-——>CTestDlg,选择三个控件的ID——->Add Variable-——>弹出对话框,变量名称:m_num1;变量类别:Value;变量类型:int——->IDC_EDIT1控件有了一个与之关联的一个int型成员变量:m_num1。
对三个控件分别进行相关操作。
现在来看一下CTestDlg类源代码增加了哪些内容:
1、在对话框类头文件中:
// Dialog Data
//{{AFX_DATA(CTestDlg)
enum { IDD = IDD_DIALOG1 };
int m_num1;
int m_num2;
CString m_num3;
//}}AFX_DATA
两个AFX_DATA注释宏之间增加了三个成员变量
2、对话框类构造函数中:对这三个成员变量进行了初始化,运行程序,发现三个编辑框里面出现了0初始值。
CTestDlg::CTestDlg(CWnd* pParent /*=NULL*/)
: CDialog(CTestDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CTestDlg)
m_num1 = 0;
m_num2 = 0;
m_num3 = _T("");
//}}AFX_DATA_INIT
m_bIsCreated=FALSE;
}
3、DoDataExchange函数内部实现了对话框控件和类成员变量的关联:调用DDX_TEXT函数,将指定ID控件与类成员变量相关联。
void CTestDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CTestDlg)
DDX_Text(pDX, IDC_EDIT1, m_num1);
DDX_Text(pDX, IDC_EDIT2, m_num2);
DDX_Text(pDX, IDC_EDIT3, m_num3);
//}}AFX_DATA_MAP
}
4、void CTestDlg::OnBtnAdd()
{
// TODO: Add your control notification handler code here
m_num3=m_num1+m_num2;
}
运行,发现并没有实现相应的加法功能。
原因:为了让编辑框里面的数据与类成员变量交换成功,必须要调用DoDataExchange函数,但是程序代码不是直接调用这个函数,而是调用UpdateData函数。
BOOL UpdateData( BOOL bSaveAndValidate = TRUE );
参数为TRUE,表示正在捕获对话框的数据;参数为FALSE,表示函数正在初始化对话框控件的文本。
void CTestDlg::OnBtnAdd()
{
// TODO: Add your control notification handler code here
UpdateData();
m_num3=m_num1+m_num2;
UpdateData(FALSE);
}
在前两个编辑框中输入任何非数值型字符,然后单击Add,就会弹出一个“请输入一个整数”的消息框,因为这个编辑框控件已经与一个int型变量相联系了。
还可以对编辑框中输入的数值进行一个范围的限定:
选择一个与控件关联的成员变量,然后就可以对它进行最大值和最小值的范围限制,我在这给它限制为0到100。
void CTestDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CTestDlg)
DDX_Text(pDX, IDC_EDIT1, m_num1);
DDV_MinMaxInt(pDX, m_num1, 0, 100);
DDX_Text(pDX, IDC_EDIT2, m_num2);
DDX_Text(pDX, IDC_EDIT3, m_num3);
//}}AFX_DATA_MAP
}
然后发现DoDataExchange函数中添加了DDV_MinMaxInt(pDX, m_num1, 0, 100);DDV表示对话框数据的校验,DDX表示对话框数据的交换。
第五种方式:
下面把编辑框控件再与一个变量相关联,这时选择控件变量。
变量类别选择:Control,变量类型自动变成:CEdit。
对三个控件关联三个控件变量。
CTestDlg头文件中增加了三个CEdit类型的成员变量:
// Dialog Data
//{{AFX_DATA(CTestDlg)
enum { IDD = IDD_DIALOG1 };
CEdit m_edit3;
CEdit m_edit2;
CEdit m_edit1;
int m_num1;
int m_num2;
int m_num3;
//}}AFX_DATA
在DoDataExchange函数中增加了三个DDX_Control函数:
void CTestDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CTestDlg)
DDX_Control(pDX, IDC_EDIT3, m_edit3);
DDX_Control(pDX, IDC_EDIT2, m_edit2);
DDX_Control(pDX, IDC_EDIT1, m_edit1);
DDX_Text(pDX, IDC_EDIT1, m_num1);
DDV_MinMaxInt(pDX, m_num1, 0, 100);
DDX_Text(pDX, IDC_EDIT2, m_num2);
DDX_Text(pDX, IDC_EDIT3, m_num3);
//}}AFX_DATA_MAP
}
在Add按钮消息响应函数中进行修改,实现加法功能。这个时候不用编辑框控件对象了,因为有编辑框控件变量了。
void CTestDlg::OnBtnAdd()
{
// TODO: Add your control notification handler code here
int num1,num2,num3;
char ch1[10],ch2[10],ch3[10];
m_edit1.GetWindowText(ch1,10);
m_edit2.GetWindowText(ch2,10);
num1=atoi(ch1);
num2=atoi(ch2);
num3=num1+num2;
itoa(num3,ch3,10);
m_edit3.SetWindowText(ch3);
}
第六种方式:
获取窗口文本的消息:WM_GETTEXT,设置窗口文本的消息:WM_SETTEXT。
Platform SDK的SendMessage函数,通过发送WM_GETTEXT消息获取前两个编辑框控件的文本;最后再发送WM_SETTEXT消息设置第三个编辑框的文本。
LRESULT SendMessage(
HWND hWnd, // handle of destination window
UINT Msg, // message to send
WPARAM wParam, // first message parameter
LPARAM lParam // second message parameter
);
第一个参数窗口句柄,第二个参数就是一个消息,第三个参数:WM_GETTEXT消息就指窗口文本的字符数,WM_SETTEXT消息没有用到wParam,所以值为0。第四个参数:指窗口文本的缓存地址,为LPARAM类型。
void CTestDlg::OnBtnAdd()
{
// TODO: Add your control notification handler code here
int num1,num2,num3;
char ch1[10],ch2[10],ch3[10];
::SendMessage(GetDlgItem(IDC_EDIT1)->m_hWnd,WM_GETTEXT,10,(LPARAM)ch1);
::SendMessage(m_edit2.m_hWnd,WM_GETTEXT,10,(LPARAM)ch2);
num1=atoi(ch1);
num2=atoi(ch2);
num3=num1+num2;
itoa(num3,ch3,10);
m_edit3.SendMessage(WM_SETTEXT,0,(LPARAM)ch3);
}
Platform SDK的SendMessage函数前面需要加::。
Platform SDK的SendMessage函数第一个参数是窗口句柄,因为控件类派生于窗口类,而窗口类中有一个成员变量:m_hWnd,用来保存当前窗口的句柄。
控件类的SendMessage成员函数如窗口类的SendMessage成员函数,不需要窗口句柄,因为类成员变量就保存了窗口句柄。
SendMessage函数最后一个参数是LPARAM型,要进行强制类型转换。
第七种方式:
直接给对话框子控件发送消息,使用函数是SendDlgItemMessage。
LRESULT SendDlgItemMessage( int nID, UINT message, WPARAM wParam = 0, LPARAM lParam = 0 );
这个函数后三个参数与SendMessage函数一样,第一个参数指定对话框控件的ID,相当于把上面的GetDlgItem和SendMessage这两个函数结合起来。
void CTestDlg::OnBtnAdd()
{
// TODO: Add your control notification handler code here
int num1,num2,num3;
char ch1[10],ch2[10],ch3[10];
SendDlgItemMessage(IDC_EDIT1,WM_GETTEXT,10,(LPARAM)ch1);
SendDlgItemMessage(IDC_EDIT2,WM_GETTEXT,10,(LPARAM)ch2);
num1=atoi(ch1);
num2=atoi(ch2);
num3=num1+num2;
itoa(num3,ch3,10);
SendDlgItemMessage(IDC_EDIT3,WM_SETTEXT,0,(LPARAM)ch3);
}
要获得编辑框复选的内容,可以利用EM_GETSEL消息来实现,wParam表示复选内容的开始位置,lParam表示复选内容的结束位置。在上述代码最后加上:
SendDlgItemMessage(IDC_EDIT3,EM_SETSEL,1,3);
但是运行后,发现第三个编辑框并没有复选,原因就是单击Add按钮后,焦点到Add按钮上面了。所以需要在SendDlgItemMessage函数后加上:
m_edit3.SetFocus();将焦点集中到编辑框三上面。
运行,发现编辑框三的内容被复选了。