登录【网站注册】点击左边“微信账号登陆”图标,微信扫描即自动注册并登陆
搜索
查看: 2048|回复: 0

[技术文章] MFC单选控件Radio使用总结

[复制链接]
发表于 2013-7-4 16:58:45 | 显示全部楼层 |阅读模式
其实MFC的单选控件radio button是可以通过关联成员变量来操控的,但是由于使用类向导有些代码是自动生成的,有时会出现莫名的错误。当然如果对MFC的机制很清楚,可以手动写代码关联。现在个人比较倾向于使用Cwnd的成员函数来操控单选控件。

一、设置Radio button控件选中不选中
IDC_RADIO1为控件的ID,如果需要设置IDC_RADIO1控制默认为选择或者不选中就需要在OnInitDialog()函数调用下面的函数。

((CButton *)GetDlgItem(IDC_RADIO1))->SetCheck(TRUE);//选上
((CButton *)GetDlgItem(IDC_RADIO1))->SetCheck(FALSE);//不选上

二、Radio button控件分组
每组的第一个单选按钮设置属性Group设置为true,从第1个Group属性为true的Radio button控件到下一个group属性为true的单选按钮的前一个单选按钮为一组(按照Tab顺序)。每一组可以设置一个成员变量与之关联。

三、用CWnd成员函数同时设置组和默认选中按钮
使用CWnd成员函数CheckRadioButton既可以设置组也可以同时设置默认选中项。

void CheckRadioButton( int nIDFirstButton, int nIDLastButton, intnIDCheckButton )

参数:

nIDFirstButton 指定组中第一个单选按钮的整数标识符。
nIDLastButton 指定组中最后一个单选按钮的整数标识符。
nIDCheckButton 指定了要选中的单选按钮的整数标识符。

说明:
从一组按钮中选择(加入检查标记)一个单选按钮并清除(清除检查标记)同组中其它单选按钮。CheckRadioButton函数向指定的单选按钮发送一条BM_SETCHECK消息。

四、获取单选按钮状态
调用类CWnd的成员函数GetCheckedRadioButton可以获取Radio button的状态

int GetCheckedRadioButton( int nIDFirstButton, int nIDLastButton )

第一个参数nIDFirstButton是同一组中的第一个单选钮控件的ID

第二个参数nIDLastButton是同一组中最后一个单选钮控件的ID

成员函数GetCheckedRadioButton返回指定组中第一个所选中的单选钮(在正常情况下仅应当有一个单钮被选中)的ID,如果没有按钮被选中,则返回0。这里需要注意的是,成员函数GetCheckedRadioButton被没有要求两个参数nIDFirstButton和nIDLastButton所指定的控件一定位于同一组中。

若干个单选钮是否属于同一组是以其Tab顺序来排定的,而GetCheckedRadioButton函数是以ID顺序来检查按钮的选定状态的。因此,如果传递给函数GetCheckedRadioButton的第一个参数的值大于第二个参数的值时,其返回值总是为0,而事实上,由这两个参数指定的单选钮的TAB顺序可能恰恰相反。因此,一般情况下我们应该尽量保证同一组单选钮的资源ID是连续递增的。通常这些资源ID是在头文件Resource.h中定义的。如果你同一组的单选钮不是一次创建的,那么它们的资源ID可能不是连续递增的,甚至可能是相反的。这时我们可以手动的修改资源头文件中的宏定义,以保证如GetCheckedRadioButton之类的成员函数得到正确的结果。
同时,这也说明一点,即使用GetCheck一个一个控件的检查各单选钮的选中状态要安全得多。

int i_check = ((CButton *)GetDlgItem(IDC_RADIO1))->GetCheck();//获取IDC_RADIO1控件选择状态

返回值(i_check的值):
0 按钮处于未选中状态
1 按钮处于选中状态
2 按钮状态不定(仅当按钮风格为BS_3STATE或BS_AUTO3STATE时)如果按钮是其它风格,则返回0。

五、关联成员变量

强调一点Radio button控件要与int型变量相连前必须对其进行分组。关于Radio button和int型变量相连的方法就不多介绍了。
优胜专注教学 技术实力最强 www.ysug.com
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则


快速回复 返回顶部 返回列表