方法一:
GetDlgItem() -> GetWindowText()
GetDlgItem() -> SetWindowText()
先找到对话框在把对方框中的值复制到字符串中
GetDlgItem(IDC_EDIT1)->GetWindowText(ch1);先找到IDC_EDIT1这个对话框,在把IDC_EDIT1这个对话框中的值赋给ch1.
例子:
int numl1, numl2, numl3;
TCHAR ch1[12], ch2[12], ch3[12];
GetDlgItem(IDC_EDIT1)->GetWindowText(ch1,12);
GetDlgItem(IDC_EDIT2)->GetWindowText(ch2, 12);
numl1 = _ttoi(ch1);
numl2 = _ttoi(ch2);
numl3 = numl1 + numl2;
_itow_s(numl3,ch3,10);
GetDlgItem(IDC_EDIT3)->SetWindowText(ch3);
说明:在mfc中似乎是不可以使用标准的字符串的,只能使用TCHAR或者CString.示例中使用的TCHAR比较古老(教程中就是这么用的)_ttoi这个函数是个通用的函数字符串转成int,但是这种函数也是很古老的,下面的_itow_s是int转字符串的。这个都不推荐使用,Format这个函数很强的大,有这个函数可以转换各种类型的数据,不用记那么多的函数。
TCHAR ch1[12], ch2[12], ch3[12];
GetDlgItem(IDC_EDIT1)->GetWindowText(ch1,12);
GetDlgItem(IDC_EDIT2)->GetWindowText(ch2, 12);
其中获取ch1在后面都要跟12这个参数,这个参数的意思是限制长度为12,因为ch1只定义了12个字符长度,这个好像是C语言的一种缺陷,要是不指定范围黑客似乎可以利用内存溢出读取ch1周围的内存值从而进行破坏。当然这种方法比较古老,使用CString据说就没这种问题,所以我改了中写法。使用CString代替。
int numl1, numl2, numl3;
CString ch1, ch2, ch3;
//TCHAR ch1[12], ch2[12], ch3[12];
GetDlgItem(IDC_EDIT1)->GetWindowText(ch1);
GetDlgItem(IDC_EDIT2)->GetWindowText(ch2);
numl1 = _ttoi(ch1);
numl2 = _ttoi(ch2);
numl3 = numl1 + numl2;
ch3.Format(_T("%d"), numl3);
GetDlgItem(IDC_EDIT3)->SetWindowText(ch3);
方法二:
GetDlgItemText()
SetDlgItemText()
和方法一相比,方法二更加简洁,直接找到对话框然后赋值 GetDlgItemText(IDC_EDIT1,ch1);
方法二和方法一差不多,只不过方法二是直接读取对话框中的值;
int numl1, numl2, numl3;
CString ch1, ch2, ch3;
//GetDlgItem(IDC_EDIT1)->GetWindowText(ch1);
//GetDlgItem(IDC_EDIT2)->GetWindowText(ch2);
GetDlgItemText(IDC_EDIT1,ch1);
GetDlgItemText(IDC_EDIT2,ch2);
numl1 = _ttoi(ch1);
numl2 = _ttoi(ch2);
numl3 = numl1 + numl2;
ch3.Format(_T("%d"), numl3);
//GetDlgItem(IDC_EDIT3)->SetWindowText(ch3);
SetDlgItemText(IDC_EDIT3,ch3);
方法三:
GetDlgItemInt()
SetDlgItemInt()
方法三是最简单的一种方法,但是有局限性,就是操作的数都是int型。
int numl1, numl2, numl3;
CString ch1, ch2, ch3;
//GetDlgItem(IDC_EDIT1)->GetWindowText(ch1);
//GetDlgItem(IDC_EDIT2)->GetWindowText(ch2);
//GetDlgItemText(IDC_EDIT1, ch1);
//GetDlgItemText(IDC_EDIT2, ch2);
numl1 = GetDlgItemInt(IDC_EDIT1);
numl2 = GetDlgItemInt(IDC_EDIT2);
//numl1 = _ttoi(ch1);
//numl2 = _ttoi(ch2);
numl3 = numl1 + numl2;
/*ch3.Format(_T("%d"), numl3);*/
//GetDlgItem(IDC_EDIT3)->SetWindowText(ch3);
//SetDlgItemText(IDC_EDIT3, ch3);
SetDlgItemInt(IDC_EDIT3,numl3);
这个操作其实一行就解决了。
SetDlgItemInt(IDC_EDIT3,GetDlgItemInt(IDC_EDIT1) + GetDlgItemInt(IDC_EDIT2));
虽然代码很优雅,但是局限性很大,灵活运用才是王道,想到了最好,想不到使用通用的方法也问题不大,毕竟代码是给别人看的,技巧固然很重要,但是要考虑他人的接受能力。
第四中方法:关联
把控件和整型变量相关联具体操作方法就是在第一个对话框右击添加变量具体操作就不演示了。
代码:
UpdateData(TRUE);
m_num3 = m_num1 + m_num2;
UpdateData(FALSE);
解释一下UpdateData(TRUE);和 UpdateData(FALSE);
UpdateData(TRUE);就是把对话框中的值更新到变量中,UpdateData(FALSE);是把变量中的值更新到对话框中。没有这两个操作时无法计算的。
如果输入的不是一个int数会检测的。
方法五:关联
把控件和控件变量相关联
int num1, num2, num3;
CString str1, str2, str3;
m_edit1.GetWindowText(str1);
m_edit2.GetWindowText(str2);
num1 = _ttoi(str1);
num2 = _ttoi(str2);
num3 = num1 + num2;
str3.Format(_T("%d"), num3);
m_edit3.SetWindowText(str3);
注意:
m_edit1 m_edit2 m_edit3是关联的控件变量,
CString转int用_ttoi 函数,而int转CString用Format函数,str3.Format(_T("%d"), num3);这个的含义就是从右向左读,num3 %d表示num3是int型ForMat转成CString str3接收。
方法六:发送消息SendMessage()
这个方法比较古老了,里面感觉有win32API编程的影子,还有句柄什么的。
代码:
int num1, num2, num3;
TCHAR str1[12], str2[12], str3[12];
CString cstr1;
::SendMessage(GetDlgItem(IDC_EDIT1)->m_hWnd,WM_GETTEXT,12,(LPARAM)str1);
::SendMessage(GetDlgItem(IDC_EDIT2)->m_hWnd, WM_GETTEXT, 12, (LPARAM)str2);
num1 = _ttoi(str1);
num2 = _ttoi(str2);
num3 = num1 + num2;
_itow_s(num3,str3,10);
::SendMessage(GetDlgItem(IDC_EDIT3)->m_hWnd,WM_SETTEXT,0,(LPARAM)str3);
这个是不支持CString的试了好多办法都不行。
尤其是核心的获取数据代码::SendMessage(GetDlgItem(IDC_EDIT1)->m_hWnd,WM_GETTEXT,12,(LPARAM)str1);这个是不能用CString的
所以TCHAR之间的转换也只能用_itow_s(num3,str3,10);这种方式了。
方法七:发送消息SendDlgItemMessage()
int num1, num2, num3;
TCHAR str1[12], str2[12], str3[12];
::SendDlgItemMessage(IDC_EDIT1,WM_GETTEXT,12,(LPARAM)str1);
::SendDlgItemMessage(IDC_EDIT2, WM_GETTEXT, 12, (LPARAM)str2);
num1 = _ttoi(str1);
num2 = _ttoi(str2);
num3 = num1 + num2;
_itow_s(num3, str3, 10);
::SendDlgItemMessage(IDC_EDIT3,WM_SETTEXT,0,(LPARAM)str3);
第七种方法其实就是把第六种简化了。