CButton类的学习

来源:互联网 发布:美国东密西根大学知乎 编辑:程序博客网 时间:2024/05/21 06:28


首先CButton类的功能可以创建单选按钮(RADIOBUTTON),复选框(CHECKBOX),和按钮(BUTTON),至于是创建什么样的按钮就看你指定的STYLE是什么了,其实CButton::Create有一个参数BS_GROUPBOX,可以用来创建一个组框(GROUP BOX){m_static.Create(_T("组合按         钮"),BS_GROUPBOX|WS_CHILD|WS_VISIBLE,CRect(200,200,350,350),this,1122);} m_static是CButton类


其他的按钮都好创建,就是在创建单选按钮的时候有点问题

1, m_btn1.Create(_T("新建按钮1"),WS_CHILD|WS_VISIBLE|BS_RADIOBUTTON|WS_GROUP ,CRect(250,250,350,300),this,1215);

BS_RADIOBUTTON第一次选的风格类型,发现他不能够选中,于是乎我响应了单击消息,在响应函数里面通过SetCheck函数来摄者按钮的状态,如下:

afx_msg void C动态创建的控件关联变量Dlg::OnRadio1(void)
{
//MessageBox(_T("选中当选1"));
m_btn1.SetCheck(BST_CHECKED);
m_btn2.SetCheck(BST_UNCHECKED);
return afx_msg void();
}

afx_msg void C动态创建的控件关联变量Dlg::OnRadio2(void)
{
//MessageBox(_T("选中单选2"));
m_btn2.SetCheck(BST_CHECKED);
m_btn1.SetCheck(BST_UNCHECKED);
return afx_msg void();
}

如此来保证有且仅有一个选中,问题是,当有10个单选按钮的时候不是很麻烦,要添加十个消息响应函数、

所以我想用孙鑫老师书上所说的关联一个INT型(只能是INT型)

所以我在这里就是通过关联变量来实现

在DoDataExchange(CDataExchange* pDX)函数里面添加:DDX_Radio(pDX,1215,m_state1);
在OnInitDialog函数里面添加
m_static.Create(_T("组合按钮"),BS_GROUPBOX|WS_CHILD|WS_VISIBLE,CRect(200,200,350,350),this,1122);
m_btn1.Create(_T("新建按钮1"),WS_CHILD|WS_VISIBLE|BS_RADIOBUTTON|WS_GROUP ,CRect(250,250,350,300),this,1215);
m_btn2.Create(_T("新建按钮2"),WS_CHILD|WS_VISIBLE|BS_RADIOBUTTON,CRect(250,300,350,350),this,1216

刚开始风格是BS_RADIOBUTTON,但是关联的m_state1的值始终都不变,现在想想,可能是这个原因,我想通过关联的变量来设置单选的状态,也许MFC自己要设置了状态之后才知道自己关联的变量是什么位置,所以“死锁”了,有点类似啊

后面我把风格改为BS_AUTORADIOBUTTON之后就可以了

真的是不好玩啊 

选中这个风格的话,在一个组里面只有一个单选按钮被选中,他会自动高亮单选按钮,标记为选中状态,同时又会把其他状态设置为未选中状态

验证:

在单选按钮添加单击消息响应函数

在消息映射函数里面添加如下

ON_BN_CLICKED(1215,OnRadioMessage)
ON_BN_CLICKED(1216,OnRadioMessage)

响应函数如下:

void C动态创建的控件关联变量Dlg::OnRadioMessage(void)
{
UpdateData();
if(m_state1==0)
{
MessageBox(_T("选中单选1"));
//m_btn1.SetCheck(BST_CHECKED);
//m_btn2.SetCheck(BST_UNCHECKED);
}
if(m_state1==1)
{
//m_btn2.SetCheck(BST_CHECKED);
//m_btn1.SetCheck(BST_UNCHECKED);
MessageBox(_T("选中单选2"));
}
}

可以看到


原创粉丝点击