【mfc】组框、单选框控件与复选框控件

VC6中的MFC中的单选框与复选框控件也不简单,它没有VS中C#那样可以之间通过一个封装之后的函数进行判断,该单选框/复选框有没有被选中啊?或者控制单选框/复选框的选中状态。这东西比较复杂,通过相应的值来控制的。


一、基本目标

下面就用一个简单例子来说明VC6中的MFC中的单选框与复选框控件,点击“确定”按钮能够判断对话框中的所有单选框与复选框的选中状态。Radio1-Radio3互成一个组,组内仅能够有一个组员被选中,Radio4-Radio5也互成一组,选择Radio4能够令复选框中的Check1-Check3全选,选择Radio5则实现了复选框的反选功能。同时为了美观,还引入了组框控件。

技术分享


二、制作过程

1、新建一个什么都没有的基于对话框的、静态DLL的MFC,怎么新建可以看我之前的《【mfc】学生信息管理,实现List控件节点的增删改查》(点击打开链接),然后在对话框中拖入组框,单选框与复选框。组框没什么好说的,可静态文本一样道理,就只有显示功能,不别设置任何函数。你只需要改改其Caption即可。

技术分享

2、之后唯一需要注意的是单选框的样式工具,在单选框的样式中,如果你选择了一个单选框为组,那么其之后直到下一个被选为“组”单选框,都是属于这个“组“,组内的单选框仅能够有一个被悬泉,举个例子就很明白了。比如上图中有Radio1-5的五个单选框,如果仅把Radio1设置为组,那么Radio1-Radio5都属于这个组,Radio1-Radio5仅能够有一个被选取。如果把Radio1与Radio4设置为组,就像上图一样,那么Radio1-Radio3仅能够有一个被选取,Radio4-Radio5仅能够有一个被选取。再又如,如果把Radio1,Radio3,Radio5选择为组,那么Radio1-Radio2、Radio3-Radio4、Radio5分别仅能能够选择一个。对比于C#把同一个组内的单选框设置为同一groudID是不同的。

技术分享

3、之后对这个主对话框中的单选框/复选框设置成员变量,以至于他们能够被程序控制,同样是Ctrl+W或者其它方式为这个对话框新建类向导,只是这个是在成员变量的标签页中设置。

技术分享

4、一般成员变量的类型按默认即可,基本上也没有你选择余地,MFC就是规定通过布尔值的是与非来判断这个复选框是否被选中。

技术分享

5、注意观察,单选框只有被选为“组”的单选框有成员变量设置,实际上这个“组”单选框已经包含其后的所有成员了。它通过int值来判断组内那个单选框被选中,-1是组内所有单选框都没有选中,0是组内第一个,1是组内第二个……以此类推

技术分享

6、对所有单选框/复选框设置完成员变量之后,如下图所示:

技术分享

7、点击“确定”就可以开始对函数的写作,你可以在ClassView中,找到刚才设置的成员变量,并且能够为单选框/复选框的初始状况,比如把m_Check1改成TRUE,那么这个对话框刚启动,复选框Check1就被选中了,而m_Radio1_3你把它改成0-2,那么所对应Radio1-3则最初就被选中。别问我改成3以上的值会怎么样,那就只有程序出错,Win32崩溃而已了。

技术分享

8、之后,你还可以与按钮一样,在控件界面,双击任意一个单选框/复选框,添加这个单选框/复选框被选中时的消息映射函数。比如,我们为单选框Radio4添加复选框全选功能则写入如下函数:

void CCheckBox_RadioDlg::OnRadio4() 
{
	//这里注意不要写成m_Check1,m_Check2...的形式
	for (int i=IDC_CHECK1;i<=IDC_CHECK3;i++){
		((CButton*)GetDlgItem(i))->SetCheck(1);
	} 
	
}
((CButton*)GetDlgItem(i))->SetCheck(1);能够设置一个复选框的值,同时IDC_CHECK1-IDC_CHECK3虽然作为控件的ID,但实质上一个int,所以可以如上所示地进行遍历。

9、而选中Radio5,则现实反选功能,所以Radio5有如下的函数的函数:

//反选
void CCheckBox_RadioDlg::OnRadio5() 
{
	// TODO: Add your control notification handler code here
	for(int i=IDC_CHECK1;i<=IDC_CHECK3;i++){
		//通过((CButton*)GetDlgItem(i))->GetCheck()也可以拿到复选框的值
		//拿单选框的值同样是没有问题的
		//但是这个函数值是记录,你时候有选择这个单选框/复选框
		if(((CButton*)GetDlgItem(i))->GetCheck()){
			((CButton*)GetDlgItem(i))->SetCheck(0);
		}
		else{
			((CButton*)GetDlgItem(i))->SetCheck(1);
		}
	} 
}
10、至于点击“确定”按钮还有判断对话框内控件时候被选中,所以OnOK应该这样写,利用条件结构来根据单选框/复选框的选中情况,执行相应的语句。

void CCheckBox_RadioDlg::OnOK() 
{
	// TODO: Add extra validation here
	
	//CDialog::OnOK();
	//这句话必须存在,意思为重新遍历一下所有控制的变量值,把用户选取的值读取进来
	UpdateData();
	CString str;
	switch(m_Radio1_3){
	case -1:
		str="单选框1_3,你什么都没有选!";
		break;
	case 0:
		str="单选框1_3,你选择你Radio1";
		break;
	case 1:
		str="单选框1_3,你选择你Radio2";
		break;
	case 2:
		str="单选框1_3,你选择你Radio3";
		break;
	}
	AfxMessageBox(str);
	switch(m_Radio4_5){
	case -1:
		str="单选框4_5,你什么都没有选!";
		break;
	case 0:
		str="单选框4_5,你选择你Radio4";
		break;
	case 1:
		str="单选框4_5,你选择你Radio5";
		break;
	}
	AfxMessageBox(str);
	str="选中:";
	if(m_Check1)
		str+="【复选框1】";
	if(m_Check2)
		str+="【复选框2】";
	if(m_Check3)
		str+="【复选框3】";
	if(!m_Check1&&!m_Check2&&!m_Check3)
		str="你没有选择任何复选框!";
	AfxMessageBox(str);
}



郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。