MFC第二十天 数值型关联变量 和单选按钮与复选框的开发应用

数值型关联变量

数值型关联变量的种类介绍

1、 数值型关联变量:

a)控件型关联变量:针对于所有MFC工具箱中的控件都有效。
DDX_Control(pDX, IDC_LIST, m_list);
b)数值型关联变量:
有部分的控件支持数值型关联变量,大部分不支持。
c)ListCtrl添加关联变量时,控件型的下拉是灰色的。
d)只有可录入的控件才支持数值型关联变量。
编辑框、下拉、日期,单选钮和多选框,另外ListBox可以关联。

2、数值型关联变量的用法:

a)CWnd::UpdateData :更新数据,可以认为集体输入输出函数。
b)代入TRUE代表从界面输入到内存(类似于cin >>)
c)代入FALSE代表从内存输出到界面(类似于cout <<)

在这里插入图片描述

单选按钮与复选框

单选按钮的组内选择原理解析

单选按钮:
a)必须分组:设立一个组长;
b)WS_GROUP这个属性,几乎所有控件都没用除了单选按钮
c)必须把一组单选按钮的第一个设立为组长
d)在类向导中建立关联变量时,会发现只有组长有权力建立数值型关联变量。

单选按钮和复选框以及应用数值型关联变量的开发

在这里插入图片描述
在这里插入图片描述

CMainDlg.cpp

初始化时对列表进行插入

BOOL CMainDlg::OnInitDialog()
{
	CDialogEx::OnInitDialog();
	SetIcon(m_hIcon, TRUE);			// 设置大图标
	SetIcon(m_hIcon, FALSE);		// 设置小图标
	m_lsit.InsertColumn(0, _T("工号"), LVCFMT_LEFT, 110);
	m_lsit.InsertColumn(1, _T("姓名"), LVCFMT_LEFT, 110);
	m_lsit.InsertColumn(2, _T("工资"), LVCFMT_LEFT, 110);
	m_lsit.InsertColumn(3, _T("入职日期"), LVCFMT_LEFT, 120);
	m_lsit.InsertColumn(4, _T("性别"), LVCFMT_LEFT, 100);
	m_lsit.InsertColumn(5, _T("学历"), LVCFMT_LEFT, 100);
	m_lsit.InsertColumn(6, _T("语言"), LVCFMT_LEFT, 160);
	m_lsit.SetExtendedStyle(LVS_EX_GRIDLINES | LVS_EX_FULLROWSELECT);
	return TRUE;  // 除非将焦点设置到控件,否则返回 TRUE
}

在这里插入图片描述

CInputDlg.h

class CInputDlg : public CDialogEx
{
	int m_sNumb;
	CDateTimeCtrl m_Date;
	CString m_sName;
	double m_fSalary;
	COleDateTime m_sDate;
	BOOL m_bSex;
	int m_edu;
	BOOL m_Eng;
	BOOL m_Jpn;
	BOOL m_Rus;
	BOOL m_Kern;
	CButton m_bEng;
	DECLARE_DYNAMIC(CInputDlg)
	void InputData();
	CString GetLange();
	CListCtrl& m_lsit;
	LPCTSTR m_es[6]{ _T("初中"),_T("高中"), _T("大专"), _T("本科"), _T("硕士"), _T("博士") };
public:
	CInputDlg(CListCtrl& list);   // 标准构造函数
	virtual ~CInputDlg();

// 对话框数据
#ifdef AFX_DESIGN_TIME
	enum { IDD = IDD_INPUT_DLG };
#endif

protected:
	virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV 支持
	DECLARE_MESSAGE_MAP()
public:
	afx_msg void OnBnClickedOk();
	afx_msg void OnBnClickedTest();
};

CInputDlg.cpp

CInputDlg::CInputDlg(CListCtrl& list)
	: CDialogEx(IDD_INPUT_DLG, nullptr), m_lsit(list)
	, m_sNumb(1000)
	, m_sName(_T(""))
	, m_fSalary(0)
	, m_sDate(COleDateTime::GetCurrentTime())
	, m_bSex(FALSE)
	, m_edu(3)
	, m_Eng(FALSE)
	, m_Jpn(FALSE)
	, m_Rus(FALSE)
	, m_Kern(FALSE)
{
}
CInputDlg::~CInputDlg()
{
}
void CInputDlg::DoDataExchange(CDataExchange* pDX){
	CDialogEx::DoDataExchange(pDX);
	DDX_Text(pDX, IDC_NUMB, m_sNumb);  // 函数 界面 内存  交换
	DDX_Control(pDX, IDC_DATETIME, m_Date);
	DDX_Text(pDX, IDC_NAME, m_sName);
	DDX_Text(pDX, IDC_SALARY, m_fSalary);
	DDX_DateTimeCtrl(pDX, IDC_DATETIME, m_sDate);
	DDX_Radio(pDX, IDC_RADIO1, m_bSex);
	DDX_Radio(pDX, IDC_RADIO3, m_edu);
	DDX_Check(pDX, IDC_CHK_ENG, m_Eng);
	DDX_Check(pDX, IDC_CHK_JPN, m_Jpn);
	DDX_Check(pDX, IDC_CHK_RUS, m_Rus);
	DDX_Check(pDX, IDC_CHK_KERN, m_Kern);
	DDX_Control(pDX, IDC_CHK_ENG, m_bEng);
}
BEGIN_MESSAGE_MAP(CInputDlg, CDialogEx)
	ON_BN_CLICKED(IDOK, &CInputDlg::OnBnClickedOk)
	ON_BN_CLICKED(IDC_TEST, &CInputDlg::OnBnClickedTest)
END_MESSAGE_MAP()

//auto p = GetOwner();	背景窗口 不属于父子关系 附着在上面
//CString str;
//p->GetWindowText(str);   
void CInputDlg::InputData()
{
	UpdateData();
	int i = m_lsit.GetItemCount();
	CString str;
//	GetDlgItemText(IDC_NUMB, str); //使用关联数值变量后可不用getdlgitem
	str.Format(_T("%d"), m_sNumb);
	m_lsit.InsertItem(i, str);
	m_lsit.SetItemText(i, 1, m_sName);
	str.Format(_T("%0.2f"), m_fSalary);
	m_lsit.SetItemText(i, 2, str); 
	str.Format(_T("%d年%d月%d日"), m_sDate.GetYear(), m_sDate.GetMonth(), m_sDate.GetDay());
	m_lsit.SetItemText(i, 3, str);
	m_lsit.SetItemText(i, 4, m_bSex?_T("女"):_T("男"));
	m_lsit.SetItemText(i, 5,m_es[m_edu]);
	m_lsit.SetItemText(i, 6, GetLange());
	SetFocus();
}

//int n =GetDlgItemInt(IDC__CHK_ENG); 原理仍然是atoi( GetDlgItemText表面的文字)
CString CInputDlg::GetLange()
{
	CString str;
	if (m_bEng.GetCheck() == BST_CHECKED)
	//if (m_Eng)
		str += _T("英语 ");
	if (m_Jpn)
		str += _T("日语 ");
	if (m_Kern)
		str += _T("韩语 ");
	if (m_Rus)
		str += _T("俄语 ");
	return str;
}
 
void CInputDlg::OnBnClickedOk()
{
	
	CWnd* p = GetFocus();
	int nID = p->GetDlgCtrlID();
	if (nID == IDOK|| nID ==IDC_DATETIME)
		InputData();
	else
		NextDlgCtrl();
	CDialogEx::OnOK();
}
void CInputDlg::OnBnClickedTest()
{
	if (++m_edu > 5)  //判断是否在范围
		m_edu = 0;

	auto p = (CButton*)GetDlgItem(IDC_EDUC); //获取指针
	int n = 0; 
	do
	{
		p->SetCheck((m_edu == n)); //设置选择和没有选择的按钮
		p = (CButton*)p->GetWindow(GW_HWNDNEXT); //向下查找
		++n;
	} while (p && !(GetStyle()&WS_GROUP));   //判断遇到下一个组长结束 而且p不等于空
}

在这里插入图片描述

附录

所有关联变量的类型(全)

 simple text operations 编辑框可以管理以下这些变量种类
void AFXAPI DDX_Text(CDataExchange* pDX, int nIDC, BYTE& value);
void AFXAPI DDX_Text(CDataExchange* pDX, int nIDC, short& value);
void AFXAPI DDX_Text(CDataExchange* pDX, int nIDC, int& value);
void AFXAPI DDX_Text(CDataExchange* pDX, int nIDC, UINT& value);
void AFXAPI DDX_Text(CDataExchange* pDX, int nIDC, long& value);
void AFXAPI DDX_Text(CDataExchange* pDX, int nIDC, DWORD& value);
void AFXAPI DDX_Text(CDataExchange* pDX, int nIDC, LONGLONG& value);
void AFXAPI DDX_Text(CDataExchange* pDX, int nIDC, ULONGLONG& value);
void AFXAPI DDX_Text(CDataExchange* pDX, int nIDC, CString& value);
void AFXAPI DDX_Text(CDataExchange* pDX, int nIDC, LPTSTR value, int nMaxLen);
void AFXAPI DDX_Text(CDataExchange* pDX, int nIDC, float& value);
void AFXAPI DDX_Text(CDataExchange* pDX, int nIDC, double& value);

special control types

void AFXAPI DDX_Check(CDataExchange* pDX, int nIDC, int& value); 复选
void AFXAPI DDX_Radio(CDataExchange* pDX, int nIDC, int& value); 单选
void AFXAPI DDX_LBString(CDataExchange* pDX, int nIDC, CString& value); ListBox
void AFXAPI DDX_LBIndex(CDataExchange* pDX, int nIDC, int& index); ListBox
//void AFXAPI DDX_LBStringExact(CDataExchange* pDX, int nIDC, CString& value);
void AFXAPI DDX_CBStringExact(CDataExchange* pDX, int nIDC, CString& value);
void AFXAPI DDX_CBString(CDataExchange* pDX, int nIDC, CString& value); //ComboBox
void AFXAPI DDX_CBIndex(CDataExchange* pDX, int nIDC, int& index);//ComboBox
void AFXAPI DDX_Scroll(CDataExchange* pDX, int nIDC, int& value);
void AFXAPI DDX_Slider(CDataExchange* pDX, int nIDC, int& value);
void AFXAPI DDX_IPAddress(CDataExchange* pDX, int nIDC, DWORD& value);
void AFXAPI DDX_DateTimeCtrl(CDataExchange* pDX, int nIDC, CString& value);
void AFXAPI DDX_DateTimeCtrl(CDataExchange* pDX, int nIDC, CTime& value);
void AFXAPI DDX_DateTimeCtrl(CDataExchange* pDX, int nIDC, COleDateTime& value);
void AFXAPI DDX_Control(CDataExchange* pDX, int nIDC, CWnd& rControl);
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Jcrry

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值