欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-05-09 10:56:02
...

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

2.2.1 技术要点:

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

2.2.2 实例步骤:

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

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

函数代码如下所示:

//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 复选框和单选按钮的使用实例

2.2.4 源程序解读:

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