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

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

2.2.1 技术要点:

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

2.2.2 实例步骤:

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

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

函数代码如下所示:

//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 复选框和单选按钮的使用实例_第9张图片

2.2.4 源程序解读:

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

你可能感兴趣的:(VC++-6-0,复选框,单选按钮,控件,实例,认识VC++6-0)