【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 herefor(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);}

天上永远不会掉馅饼,不要因为贪图一时的快乐而付出惨痛的代价,

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

相关文章:

你感兴趣的文章:

标签云: