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