2.2 复选框和单选按钮的使用实例

来源:互联网 发布:node schedule 中断 编辑:程序博客网 时间:2024/05/21 22:27

复选框和单选按钮都用于在界面上显示一些选项供用户选择,界面上的复选框可以随意选择或取消选择,而处于同一组的单选按钮,同时只能有一个处于选中状态,当一个单选按钮变成选择状态时,其同组中之前选中的控件将自动清除选择状态;

2.2.1 技术要点:

  • 和按钮控件一样,复选框和单选按钮在单击时都会发出 BN_ CLICKED 消息;
  • 实际上,复选框和单选框按钮本身就是按钮控件,只是比普通按钮控件多了“BS_ CHECKBOX ”、“BS_ RADIOBUTTON ”等风格,使得其功能和外观不同于普通按钮;
  • 在 MFC 中,对这两种控件的封装都是 CButton 类;

2.2.2 实例步骤:

本实例通过一个三基色测试程序,演示复选框控件和单选控件的使用方法。实例步骤如下:

  1. 新建一个基于对话框的 MFC 应用程序,项目名称为“CheckBoxDemo”;这里写图片描述
  2. 在主对话框上添加3个复选框控件,将其ID分别修改为“IDC_ CHK_ RED”、“IDC_ CHK_ GREEN”和“IDC_ CHK_ BLUE”。文本属性分别修改为“红”、“绿”和“蓝”;这里写图片描述
  3. 在主对话框上添加两个单选按钮控件,将其 ID 分别修改为“ IDC_ RD_ RECT”和“ IDC_ RD_ ROUND”,文本属性分别修改为“矩形”和“圆形”。添加控件后,选中“IDC_ RD_ RECT”的“Group”属性。注意在添加控件时要连续按照顺序添加,以保证其 ID 的连续性;这里写图片描述
  4. 在对话框中单击鼠标右键,并单击弹出菜单中的“ClassWizard”项,打开类向导。在类向导中选择“Member Variables”选项卡,在“Control IDs”列表框中选中“IDC_ CHK_ BLUE”。单击“Add Variable”按钮,将弹出添加变量对话框,在“Member variable name”文本框中输入变量名称“m_ chk_ blue”,并将“Category”下拉框的选项修改为“Control”,单击“OK”按钮为控件添加控件型变量;这里写图片描述这里写图片描述
  5. 重复上诉步骤,为对话框上的所有复选框的单选框按钮添加控件型变量,添加变量后的类向导界面如图;这里写图片描述
  6. 再通过类向导为主对话框添加“WM_ ERASEBKGND”消息的响应函数。注意要先将类向导中“Class Info”标签页中的“Message filter”修改为“Window”,才能在“Message Maps”标签页中看到该消息;这里写图片描述这里写图片描述

函数代码如下所示:

//WM_ERASEBKGND消息的响应函数BOOL CCheckBoxDemoDlg::OnEraseBkgnd(CDC* pDC) {    //先绘制默认背景    BOOL bRet = CDialog::OnEraseBkgnd(pDC);    //获取复选框控件所选的颜色    int nRed, nGreen, nBlue;    nRed = m_chk_red.GetCheck() ? 255 : 0;    nGreen = m_chk_green.GetCheck() ? 255 : 0;    nBlue = m_chk_blue.GetCheck() ? 255 : 0;    //根据选择组成颜色    COLORREF crFore = RGB(nRed, nGreen, nBlue);    //创建指定颜色的画刷    CBrush brush;    brush.CreateSolidBrush(crFore);    //将画刷选入DC    CBrush *pOldBrush = pDC->SelectObject(&brush);    //根据选择,绘制矩形或圆形    RECT rc = {50, 20, 150, 120};    if(m_rd_rect.GetCheck())        pDC->Rectangle(&rc);    else        pDC->Ellipse(&rc);    //恢复DC原状    pDC->SelectObject(pOldBrush);    return bRet;}

通过类向导,为主对话框上的所有复选框和单选按钮添加单击事件的响应函数,函数代码如下:

//界面上的单选按钮和复选框的单击事件响应函数void CCheckBoxDemoDlg::OnChkBlue() {    //选项改变时,让对话框重绘    Invalidate();}//其余控件均采用相同的处理代码void CCheckBoxDemoDlg::OnChkGreen() {    OnChkBlue();}void CCheckBoxDemoDlg::OnChkRed() {    OnChkBlue();}void CCheckBoxDemoDlg::OnRdRect() {    OnChkBlue();}void CCheckBoxDemoDlg::OnRdRound() {    OnChkBlue();}

在主对话框的 OnInitDialog 事件中添加如下所示的初始化代码:

BOOL CCheckBoxDemoDlg::OnInitDialog(){    CDialog::OnInitDialog();    // Set the icon for this dialog.  The framework does this automatically    //  when the application's main window is not a dialog    SetIcon(m_hIcon, TRUE);         // Set big icon    SetIcon(m_hIcon, FALSE);        // Set small icon    // TODO: Add extra initialization here    //默认选择“圆形”单选按钮    CheckRadioButton(IDC_RD_RECT, IDC_RD_ROUND, IDC_RD_ROUND);      return TRUE;  // return TRUE  unless you set the focus to a control}

2.2.3 程序运行:

按 F5 键运行程序,修改界面上的选项,程序就会自动在界面上绘制出指定颜色的图形:这里写图片描述

2.2.4 源程序解读:

  • 通过本节实例,读者可以掌握给对话框上的控件添加变量的方法。变量有两种类型,一种是控件变量,通过该变量可以访问和控制控件的所有属性。另一种是数值型变量,通过该变量可以方便地访问控件的值,但无法访问更多属性;
  • 一组单选按钮控件在对话框上必须具有连续的ID,并且这组控件中的第一个选中了“Group”属性,这样这组控件就具有了互斥特性,以保证同时只有一个能被选中;
原创粉丝点击