MFC笔记——第二节课(访问对话框控件的七种方法)

方法一:

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);

第七种方法其实就是把第六种简化了。

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

波雅_汉库克

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

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

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

打赏作者

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

抵扣说明:

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

余额充值