按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!
————未阅读完?加入书签已便下次继续阅读!
Notify: 决定在默认情况下当单选钮被单击或双击时
向父窗口发送通知消息。类型:布尔值 默认
值:真
图6。 31 具有Pusk…like样式的单选钮
…………………………………………………………Page 331……………………………………………………………
5。 将性别框内的两个控件的ID按从上到下的顺序设置为IDC_SEX1和
IDC_SEX2;将年龄框内的两个控件的ID按从上到下的顺序设置为
IDC_AGE1、IDC_AGE2、IDC_AGE3、IDC_AGE4和IDC_AGE5。
在程序运行时可以调用CButton的成员函数SetCheck设置单选钮的选
中状态。该成员函数带有一个类型为整型的参数,该参数为0表示清
除选中按钮的选中状态,参数为1表示设置选中按钮的选中状态。
l 注意:
l 如果我们在程序中调用SetCheck设置同一组中某一单选钮的为选
中状态,并不意味着同时清除同一组中其它单选钮的选中状态。
以前面创建的工程来举例,请看下面的两行代码 :
l ((CButton*)GetDlgItem(IDC_AGE1))…》SetCheck(1);
l ((CButton*)GetDlgItem(IDC_AGE5))…》SetCheck(1);
上面的代码将导致年龄组中的第一个按钮和第五个按钮在对
话框第一次显示时同时处于选中状态。这是应该避免的。因
此,如果我们通过代码改变了单选钮的选中状态,一定要记
得同时清除同组的其它单选钮的选中状态。
对于单个的单选钮,我们可以调用类CButton的成员函数GetCheck,
该函数的返回值为0、1或2,分别代表按钮处理未选中状态、选中状
态或中间状态 (对三态复选框而言)。但是,对于对话框中的单选锯而
言,我们更感兴趣于同一组单选钮中哪一个被选中,因此,调用类
CWnd的成员函数GetCheckedRadioButton要更为方便。该成员函数原
型如下:
int GetCheckedRadioButton( int nIDFirstButton; int nIDLastButton );
第一个参数nIDFirstButton是同一组中的第一个单选钮控件的ID,
nIDLastButton是同一组中最后一个单选钮控件的ID。成员函数
GetCheckedRadioButton返回指定组中第一个所选中的单选钮 (在正常
情况下仅应当有一个单钮被选中)的ID,如果没有按钮被选中,则返
回0。
这里需要注意的是,成员函数GetCheckedRadioButton被没有要求两
个参数nIDFirstButton和nIDLastButton所指定的控件一定位于同一
组中。
…………………………………………………………Page 332……………………………………………………………
l 注意:
l 若干个单选钮是否属于同一组是以其Tab顺序来排定的,而
GetCheckedRadioButton函数是以ID顺序来检查按钮的选定状态
的。因此,如果传递给函数GetCheckedRadioButton的第一个参数
的值大于第二个参数的值时,其返回值总是为0,而事实上,由这
两个参数指定的单选钮的TAB顺序可能恰恰相反。因此,一般情况
下我们应该尽量保证同一组单选钮的资源ID是连续递增的。通常
这些资源ID是在头文件Resource。h中定义的。如果你同一组的单
选钮不是一次创建的,那么它们的资源ID可能不是连续递增的,
甚至可能是相反的。这时我们可以手动的修改资源头文件中的宏
定义,以保证如GetCheckedRadioButton之类的成员函数得到正确
的结果。
同时,这也说明一点,即使用GetCheck一个一个控件的检查
各单选钮的选中状态要安全得多。
下面我们来完成应用程序RadioButton 。
首先,使用ClassWizard重载类CDialog的OnOK成员函数,方法是重载
ID为IDOK的按钮的BN_CLICKED命令处理函数。由ClassWizard生成的
默认重载形式如下:
void CRadioBoxDlg::OnOK()
{
// TODO: 在此添加附加的验证
CDialog::OnOK();
}
这里特定的代码来替代前面的// TODO注释后得到如下的程序代码:
void CRadioBoxDlg::OnOK()
{
// 暂时隐藏主对话框
ShowWindow(SW_HIDE);
UINT nSex=GetCheckedRadioButton(IDC_SEX1;IDC_SEX2); // 获得性别选择
UINT nAge=GetCheckedRadioButton(IDC_AGE1;IDC_AGE5); // 获得年龄选择
…………………………………………………………Page 333……………………………………………………………
CString msg=〃性别: 〃; // 保存输出消息字符串
// 根据用户的选择生成消息串
// 添加性别信息
switch (nSex)
{
case IDC_SEX1:
msg+=〃男n〃;
break;
case IDC_SEX2:
msg+=〃女n〃;
break;
default:
break;
}
// 添加年龄信息
msg+=〃年龄: 〃;
switch (nAge)
{
case IDC_AGE1:
msg+=〃18 岁以下〃;
break;
case IDC_AGE2:
msg+=〃18 25 岁〃;
break;
case IDC_AGE3:
msg+=〃25 35 岁〃;
…………………………………………………………Page 334……………………………………………………………
break;
case IDC_AGE4:
msg+=〃35 45 岁〃;
break;
case IDC_AGE5:
msg+=〃45 岁以上〃;
break;
default:
break;
}
msg+=〃nn 以上数据是否正确?〃;
// 显示输入消息框询问用户所输入的信息是否正确
if(MessageBox(msg;NULL;MB_YESNO|MB_ICONQUESTION)==IDNO)
{
// 当用户回答 “否”时重新显示对话框以供便用户可以更改所作的选择
ShowWindow(SW_SHOW);
return;
}
// 否则退出应用程序
CDialog::OnOK();
}
以上应用程序的运行结果如图6。32所示:
按如图6。32所示进行选择,单击确定弹出如图6。33所示的对话框。
下一节中我们将讲述复选框的使用。
…………………………………………………………Page 335……………………………………………………………
图6。 32 单选钮示例程序的运行结果
图6。 33 单击 “确定”之后的确认消息框
6。3。5 复选框
复选框与单选钮很相象,不同之处在于在同一组控件中,通常使用复
选框来代表多重选择,即选项不是互斥的。从外观上来说,复选框所
使用的选中标记是一个方框和方框里面的小叉,而不是单选钮所使用
的小圆圈和里面的小点。
对于编程者来说,复选框和单选钮非常相似。我们通过SetCheck成员
函数来设置某一复选框的选中状态,通过GetCheck成员函数来获取某
一复选框的选中状态。一般来说,对于复选框,由于其选项不是互斥
的,我们一般不通过GetCheckedRadioButton之类的函数来获得处于
选中状态的按钮。
以下特定于复选框的样式可以Properties对话框的Styles属性页中进
行设置:
Auto: 对于Auto属性为真的复选框,在单击时将 自动
在 “选中”和 “不选中”之间进行切换。如果
在一组复选框中使用了Dialog Data
Exchange,则必须将该属性设置为真。类型:
布尔值 默认值:真
Tri 创建三态复选框。除了处于 “选中”和 “不选