CButton类的学习


首先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"));
}
}

可以看到


  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
如果你想在 MFC 对话框中使用自定义的 CButton 控件,可以通过重写 CButton 来实现。 以下是示例代码: 1. 创建一个新的 MFC 对话框应用程序。 2. 打开对话框资源,将一个普通按钮控件拖动到对话框中。 3. 右键单击该按钮控件,选择“属性”。 4. 在属性窗口中,将“ID”设为 IDC_MYBUTTON,然后将“样式”设为“自动大小”。 5. 单击“确定”以关闭属性窗口。 6. 在 Visual Studio 中,打开 ClassView 窗口,找到对话框。 7. 右键单击对话框,选择“添加”。 8. 在“添加”对话框中,选择“MFC ”,然后选择“CButton”作为基。 9. 为新的 CButton 指定名称(例如 MyButton)和文件名(例如 MyButton.cpp 和 MyButton.h)。 10. 在 MyButton.h 中,将声明更改为以下内容: ```cpp #pragma once #include "afxbutton.h" class MyButton : public CMFCButton { public: MyButton(); virtual ~MyButton(); virtual BOOL PreTranslateMessage(MSG* pMsg); afx_msg void OnLButtonUp(UINT nFlags, CPoint point); DECLARE_MESSAGE_MAP() }; ``` 11. 在 MyButton.cpp 中,将实现更改为以下内容: ```cpp #include "stdafx.h" #include "MyButton.h" #ifdef _DEBUG #define new DEBUG_NEW #endif MyButton::MyButton() { } MyButton::~MyButton() { } BOOL MyButton::PreTranslateMessage(MSG* pMsg) { // TODO: 在此添加专用代码和/或调用基 return CMFCButton::PreTranslateMessage(pMsg); } void MyButton::OnLButtonUp(UINT nFlags, CPoint point) { // TODO: 在此添加消息处理程序代码和/或调用默认值 CMFCButton::OnLButtonUp(nFlags, point); } BEGIN_MESSAGE_MAP(MyButton, CMFCButton) ON_WM_LBUTTONUP() END_MESSAGE_MAP() ``` 12. 在对话框的头文件中添加一个 MyButton 成员变量: ```cpp #include "MyButton.h" class CMFCApplication1Dlg : public CDialogEx { // ... private: MyButton m_MyButton; // ... }; ``` 13. 在 OnInitDialog() 函数中,使用以下代码创建 MyButton 控件: ```cpp BOOL CMFCApplication1Dlg::OnInitDialog() { CDialogEx::OnInitDialog(); // 将“关于”菜单项添加到系统菜单中。 // IDM_ABOUTBOX 必须在系统命令范围内。 ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX); ASSERT(IDM_ABOUTBOX < 0xF000); CMenu* pSysMenu = GetSystemMenu(FALSE); if (pSysMenu != NULL) { CString strAboutMenu; strAboutMenu.LoadString(IDS_ABOUTBOX); if (!strAboutMenu.IsEmpty()) { pSysMenu->AppendMenu(MF_SEPARATOR); pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu); } } // 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动 // 执行此操作 SetIcon(m_hIcon, TRUE); // 设置大图标 SetIcon(m_hIcon, FALSE); // 设置小图标 // TODO: 在此添加额外的初始化代码 m_MyButton.Create(_T("My Button"), WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON | BS_AUTOSIZE, CRect(10, 10, 100, 30), this, IDC_MYBUTTON); return TRUE; // 除非将焦点设置到控件,否则返回 TRUE } ``` 现在你已经成功地重写了 CButton 并创建了一个自定义按钮控件。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值