7.4.3编辑框控件

实现:前两个编辑框输入一个数字,单击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
}
4void 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();将焦点集中到编辑框三上面。
运行,发现编辑框三的内容被复选了。
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

身影王座

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值