添加当前模块大概功能的描述,希望不要把所有接口文档写在一个文件中,至少按模块分类。
添加单选框和多选框,并设置每一个的第一个按钮为组的起始范围
设置 男的属性中 组为TRUE,设置 全选 属性中 组为TRUE,设置全选的Tri-state为TRUE
在第一组{男} 上绑定变量。每一组 单选框可以绑定一个整形变量,当使用update(true)
在单选按钮上双击,创建一个函数
在茄子、西瓜、苹果 按钮上添加变量,
茄子 的整形变量为 BOOL m_CheckBoxValue1;
西瓜 是控件变量为 CButton m_CheckBoxCtrl2;
苹果 为整形变量 BOOL m_CheckBoxValue3;
全选 为控件变量 CButton m_CheckBoxAllSelect;
在全选和多选按钮上双击 添加函数
全选 绑定的函数为 OnBnClickedCheck1()
多选为手动绑定的函数为 OnCommandRange

//添加的变量
BOOL m_Radiobutton;
afx_msg void OnBnClickedButton1();
afx_msg void OnBnClickedButton2();
BOOL m_CheckBoxValue1;
CButton m_CheckBoxCtrl2;
BOOL m_CheckBoxValue3;
CButton m_CheckBoxAllSelect;
afx_msg void OnCommandRange(UINT uId);
afx_msg void OnBnClickedCheck1();
afx_msg void OnBnClickedCheck2();
响应的函数如下
// 用于响应获取单选按钮的按钮点击事件
void CMyDlg::OnBnClickedGetRadioButton()
{
// 每一[组]单选框可以绑定一个整型变量,当使用 UpdateData(TRUE)
// 从控件中获取当前的选中项时,整型变量是一个从 0 开始的计数
UpdateData();
// 从被选中的单选框中获取到选中的文字信息
CString ButtonText;
this->GetDlgItemTextW(IDC_RADIO1 + m_RadioButton, ButtonText);
// 通过弹框输出选中的信息
MessageBox(ButtonText);
}
// 响应复选按钮点击事件的函数
void CMyDlg::OnBnClickedGetCheckboxButton()
{
// 通过 UpdateData 将控件的状态更新到相应的变量中
UpdateData(TRUE);
// 对于一个绑定了 BOOL 值类型的多选框,当选中时,它的值保存的是
// 1,没有选中保存的是 0,不确定状态保存的是 2
// 创建一个字符串变量保存所有被选中的状态,进行输出
CString CheckedItem, Temp;
if (m_CheckBoxValue1 == BST_CHECKED)
{
this->GetDlgItemTextW(IDC_CHECK2, Temp);
CheckedItem += Temp + L" ";
}
if (m_CheckBoxCtrl2.GetCheck() == BST_CHECKED)
{
m_CheckBoxCtrl2.GetWindowTextW(Temp);
CheckedItem += Temp + L" ";
}
if (m_CheckBoxValue3 == BST_CHECKED)
{
this->GetDlgItemTextW(IDC_CHECK4, Temp);
CheckedItem += Temp + L" ";
}
// 统一的输出所有被选中的项
MessageBox(CheckedItem);
}
// 相应第一个多选框按钮的点击事件
void CMyDlg::OnBnClickedCheck1()
{
// 根据当前的选中设置其它的多选框状态,全选或者全不选
int CheckState = m_CheckBoxAllSelect.GetCheck();
// 将其它的值设置成和全选按钮相同的状态
m_CheckBoxCtrl2.SetCheck(CheckState);
m_CheckBoxValue1 = m_CheckBoxValue3 = CheckState;
// 通过 UpdateData(FALSE) 进行修改
UpdateData(FALSE);
}
// 用于响应当前三个多选按钮的点击事件
void CMyDlg::OnCommandRange(UINT uId)
{
// 获取当前所有按钮的状态
UpdateData();
// 定义一个变量,保存有几个按钮被点击了
int Count = 0;
if (m_CheckBoxValue1 == BST_CHECKED)
Count += 1;
if (m_CheckBoxCtrl2.GetCheck() == BST_CHECKED)
Count += 1;
if (m_CheckBoxValue3 == BST_CHECKED)
Count += 1;
// 如果所有按钮都被选中,那么就设置为全选的
if (Count == 3)
m_CheckBoxAllSelect.SetCheck(BST_CHECKED);
else if (Count == 0)
m_CheckBoxAllSelect.SetCheck(BST_UNCHECKED);
else
m_CheckBoxAllSelect.SetCheck(BST_INDETERMINATE);}
如果是手动添加的函数 需要自己添加函数对应的宏
// 在这两个宏的中间,编写相应消息对应的宏
BEGIN_MESSAGE_MAP(CMyDlg, CDialogEx)
ON_BN_CLICKED(IDC_GET_RADIO_BUTTON, &CMyDlg::OnBnClickedGetRadioButton)
ON_BN_CLICKED(IDC_GET_CHECKBOX_BUTTON, &CMyDlg::OnBnClickedGetCheckboxButton)
ON_BN_CLICKED(IDC_CHECK1, &CMyDlg::OnBnClickedCheck1)
// 可以使用一个响应函数响应多个标准控件的点击消息
ON_COMMAND_RANGE(IDC_CHECK2, IDC_CHECK4, OnCommandRange)
END_MESSAGE_MAP()
// CMyDlg.h: 头文件
//
#pragma once
// CMyDlg 对话框
class CMyDlg : public CDialogEx
{
public:
// 构造函数要求传入的参数是指向父类对象的指针(不是句柄)
CMyDlg(CWnd* pParent = nullptr);
// 和 [类向导] 相关,如果删除了这一行,那么类向导功能会不完整
#ifdef AFX_DESIGN_TIME
enum { IDD = IDD_MYDIALOG };
#endif
protected:
// 支持变量和控件之间的数据交换
virtual void DoDataExchange(CDataExchange* pDX) override;
protected:
// 这是一个虚函数,用于响应对话框的创建消息
virtual BOOL OnInitDialog() override;
// 消息映射宏用于支持消息和对应函数的响应
DECLARE_MESSAGE_MAP()
public:
// 单选按钮可以绑定一个整数类型的值,当选中了某一个单选按钮之后
// 对应的值就是从索引 0 开始记录的一个位置
BOOL m_RadioButton;
BOOL m_CheckBoxValue1;
CButton m_CheckBoxCtrl2;
BOOL m_CheckBoxValue3;
CButton m_CheckBoxAllSelect;
afx_msg void OnBnClickedGetRadioButton();
afx_msg void OnBnClickedGetCheckboxButton();
afx_msg void OnBnClickedCheck1();
afx_msg void OnCommandRange(UINT uId);
};
// CMyDlg.cpp: 实现文件
//
#include "pch.h"
#include "framework.h"
#include "CMyWinApp.h"
#include "CMyDlg.h"
#include "afxdialogex.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
// CMyDlg 对话框
// 将资源 ID 硬编码传入了父类的构造函数中,绑定了资源
CMyDlg::CMyDlg(CWnd* pParent /*=nullptr*/)
: CDialogEx(IDD_MYDIALOG, pParent), m_RadioButton(FALSE)
, m_CheckBoxValue1(FALSE)
, m_CheckBoxValue3(FALSE)
{ }
// 如果用户调用了 UpdateData 函数就会间接的进行数据交换,用户每绑定一个变量
// 到控件,该函数中就会多出一行代码用于支持数据交换。[在响应父类 OnInitDialog
// 消息的时候,这个函数也会被自动调用一次]
void CMyDlg::DoDataExchange(CDataExchange* pDX)
{
CDialogEx::DoDataExchange(pDX);
DDX_Radio(pDX, IDC_RADIO1, m_RadioButton);
DDX_Check(pDX, IDC_CHECK2, m_CheckBoxValue1);
DDX_Control(pDX, IDC_CHECK3, m_CheckBoxCtrl2);
DDX_Check(pDX, IDC_CHECK4, m_CheckBoxValue3);
DDX_Control(pDX, IDC_CHECK1, m_CheckBoxAllSelect);
}
// 在这两个宏的中间,编写相应消息对应的宏
BEGIN_MESSAGE_MAP(CMyDlg, CDialogEx)
ON_BN_CLICKED(IDC_GET_RADIO_BUTTON, &CMyDlg::OnBnClickedGetRadioButton)
ON_BN_CLICKED(IDC_GET_CHECKBOX_BUTTON, &CMyDlg::OnBnClickedGetCheckboxButton)
ON_BN_CLICKED(IDC_CHECK1, &CMyDlg::OnBnClickedCheck1)
// 可以使用一个响应函数响应多个标准控件的点击消息
ON_COMMAND_RANGE(IDC_CHECK2, IDC_CHECK4, OnCommandRange)
END_MESSAGE_MAP()
// 响应对话框的创建消息
BOOL CMyDlg::OnInitDialog()
{
// 如果这个地方没有编写这句话,数据就不会在初始化的时候进行绑定
CDialogEx::OnInitDialog();
return TRUE;
}
// 用于响应获取单选按钮的按钮点击事件
void CMyDlg::OnBnClickedGetRadioButton()
{
// 每一[组]单选框可以绑定一个整型变量,当使用 UpdateData(TRUE)
// 从控件中获取当前的选中项时,整型变量是一个从 0 开始的计数
UpdateData();
// 从被选中的单选框中获取到选中的文字信息
CString ButtonText;
this->GetDlgItemTextW(IDC_RADIO1 + m_RadioButton, ButtonText);
// 通过弹框输出选中的信息
MessageBox(ButtonText);
}
// 响应复选按钮点击事件的函数
void CMyDlg::OnBnClickedGetCheckboxButton()
{
// 通过 UpdateData 将控件的状态更新到相应的变量中
UpdateData(TRUE);
// 对于一个绑定了 BOOL 值类型的多选框,当选中时,它的值保存的是
// 1,没有选中保存的是 0,不确定状态保存的是 2
// 创建一个字符串变量保存所有被选中的状态,进行输出
CString CheckedItem, Temp;
if (m_CheckBoxValue1 == BST_CHECKED)
{
this->GetDlgItemTextW(IDC_CHECK2, Temp);
CheckedItem += Temp + L" ";
}
if (m_CheckBoxCtrl2.GetCheck() == BST_CHECKED)
{
m_CheckBoxCtrl2.GetWindowTextW(Temp);
CheckedItem += Temp + L" ";
}
if (m_CheckBoxValue3 == BST_CHECKED)
{
this->GetDlgItemTextW(IDC_CHECK4, Temp);
CheckedItem += Temp + L" ";
}
// 统一的输出所有被选中的项
MessageBox(CheckedItem);
}
// 相应第一个多选框按钮的点击事件
void CMyDlg::OnBnClickedCheck1()
{
// 根据当前的选中设置其它的多选框状态,全选或者全不选
int CheckState = m_CheckBoxAllSelect.GetCheck();
// 将其它的值设置成和全选按钮相同的状态
m_CheckBoxCtrl2.SetCheck(CheckState);
m_CheckBoxValue1 = m_CheckBoxValue3 = CheckState;
// 通过 UpdateData(FALSE) 进行修改
UpdateData(FALSE);
}
// 用于响应当前三个多选按钮的点击事件
void CMyDlg::OnCommandRange(UINT uId)
{
// 获取当前所有按钮的状态
UpdateData();
// 定义一个变量,保存有几个按钮被点击了
int Count = 0;
if (m_CheckBoxValue1 == BST_CHECKED)
Count += 1;
if (m_CheckBoxCtrl2.GetCheck() == BST_CHECKED)
Count += 1;
if (m_CheckBoxValue3 == BST_CHECKED)
Count += 1;
// 如果所有按钮都被选中,那么就设置为全选的
if (Count == 3)
m_CheckBoxAllSelect.SetCheck(BST_CHECKED);
else if (Count == 0)
m_CheckBoxAllSelect.SetCheck(BST_UNCHECKED);
else
m_CheckBoxAllSelect.SetCheck(BST_INDETERMINATE);}

undefined