【MFC入门】之三 标准控件在可视化编程中的应用之组合框控件

组合框顾名思义既可以输入又可以选择就叫做组合框

组合框的sort风格会对初始化后的内容进行排序,如果不需要进行排序应该在选中组合框控件的时候将sort风格取消

OnInitDialog中添加初始化程序
UpdateData(TRUE);将对话框各空间的内容更新到所对应的成员变量当中
UpdateData(FALSE);将成员变量的值更新到对话框中的控件
指向对象的指针函数GetDlgItem使得两个复选框复选
GetDlgItem(IDC_DATE_EDIT)->ShowWindow(SW_SHOW);等价于 m_DateEdit.ShowWindow(SW_SHOW);
GetCheckedRadioButton获取选中ID号码
_CRT_SECURE_NO_WARNINGS;指令消除安全因素原因报错
SelectString(-1,L"**")为显示默认初始值的成员函数
通过调用UpdateData(TRUE/FALSE)实施更新


第一个练习:选择显示星期数

相对简单创建一个组合框控件,通过下拉列表直接选择到底是礼拜几,选中以后弹出一个MessageBox上面显示选中的星期数

组合框有sort风格会对里边内容实施排序需要实现下面功能首先要取消sort风格

实现程序如下,首先是在初始化的地方加入星期**,退出代码就一个OnOK(),不写进去

如下代码

BOOL C星期选择练习Dlg::OnInitDialog()
{
	CDialogEx::OnInitDialog();
	// 设置此对话框的图标。  当应用程序主窗口不是对话框时,框架将自动
	//  执行此操作
	SetIcon(m_hIcon, TRUE);			// 设置大图标
	SetIcon(m_hIcon, FALSE);		// 设置小图标

	m_cb.AddString(L"星期一");
	m_cb.AddString(L"星期二");
	m_cb.AddString(L"星期三");
	m_cb.AddString(L"星期四");
	m_cb.AddString(L"星期五");
	m_cb.AddString(L"星期六");
	m_cb.AddString(L"星期天");


	// TODO:  在此添加额外的初始化代码

	return TRUE;  // 除非将焦点设置到控件,否则返回 TRUE
}

然后因为选择组合框将会产生CBN_SELCHANGE消息,因此添加下列相应函数

void C星期选择练习Dlg::OnCbnSelchangeCombo()
{
	// TODO:  在此添加控件通知处理程序代码
	CString msg;
	m_cb.GetLBText(m_cb.GetCurSel(), msg);
	//返回组合框列表中制定条目的字符串
	AfxMessageBox(msg);
}
简而言之,该程序主要flow如下图

第二个练习:创建一个简单的成绩系统

如下图所示可以实现显示隐藏,可输入不可输入,显示时间/日期,选择性别,年龄,课程等操作



下面为相关相应函数的代码

UpdateData(TRUE);将对话框各空间的内容更新到所对应的成员变量当中

UpdateData(FALSE);将成员变量的值更新到对话框中的控件

第一步编写Check的响应函数

1,获取时间 2,获取响应 3,选中编辑框并且更新编辑框

//该程序为 日期Check的响应函数
void CApplicationofSELECTBOXDlg::OnBnClickedDateCheck()
{
	// TODO:  在此添加控件通知处理程序代码
	UpdateData(TRUE);
	//当前的屏幕显示内容更新空间的变量
	//等同于从屏幕上读取变量的值,然后将这些值
	//刷新到与控件绑定的变量中
	{
		CTime tNow;
		tNow = CTime::GetCurrentTime();
		CString sNow = tNow.Format("%y年%m月%d日");
		if (m_DateCheck == TRUE)
		{
			m_DateEdit.SetSel(0, -1);
			m_DateEdit.ReplaceSel(sNow);
		}
		else
		{
			m_DateEdit.SetSel(0, -1);
			m_DateEdit.ReplaceSel(L"");
		}
	}
	UpdateData(FALSE);

}

//该程序为 时间Check的响应函数
void CApplicationofSELECTBOXDlg::OnBnClickedTimeCheck()
{
	// TODO:  在此添加控件通知处理程序代码
	UpdateData(TRUE);
	{
		CTime tNow;
		tNow = CTime::GetCurrentTime();
		CString sNow = tNow.Format("%I时%M分%S秒");
		if (m_TimeCheck == TRUE)
		{
			m_TimeEdit.SetSel(0, -1);
			m_TimeEdit.ReplaceSel(sNow);
		}
		else
		{
			m_TimeEdit.SetSel(0, -1);
			m_TimeEdit.ReplaceSel(L"");
		}
	}
	UpdateData(FALSE);
}

接下来编写显示以及隐藏按钮的响应函数

调用函数为ShowWindow,对于成员变量来说这只是一个成员函数,对于那些ID来说使用指向对象的指针函数GetDlgItem使得两个复选框复选

备注

GetDlgItem(IDC_DATE_EDIT)->ShowWindow(SW_SHOW);等价于m_DateEdit.ShowWindow(SW_SHOW);

为显示和隐藏的两种写法,可以二选一

//显示按钮
void CApplicationofSELECTBOXDlg::OnBnClickedShowButton()
{
	// TODO:  在此添加控件通知处理程序代码
	GetDlgItem(IDC_DATE_CHECK)->ShowWindow(SW_SHOW);
	GetDlgItem(IDC_TIME_CHECK)->ShowWindow(SW_SHOW);
	GetDlgItem(IDC_DATE_EDIT)->ShowWindow(SW_SHOW);
	GetDlgItem(IDC_TIME_EDIT)->ShowWindow(SW_SHOW);
	m_DateEdit.ShowWindow(SW_SHOW);
	m_TimeEdit.ShowWindow(SW_SHOW);
}

//隐藏按钮
void CApplicationofSELECTBOXDlg::OnBnClickedHideButton()
{
	// TODO:  在此添加控件通知处理程序代码
	GetDlgItem(IDC_DATE_CHECK)->ShowWindow(SW_HIDE);
	GetDlgItem(IDC_TIME_CHECK)->ShowWindow(SW_HIDE);
	GetDlgItem(IDC_DATE_EDIT)->ShowWindow(SW_HIDE);
	GetDlgItem(IDC_TIME_EDIT)->ShowWindow(SW_HIDE);
	m_DateEdit.ShowWindow(SW_HIDE);
	m_TimeEdit.ShowWindow(SW_HIDE);
}

第三步编写 使能和旁置的响应函数

调用成员函数EnableWindow,使用方法与上述大同小异

void CApplicationofSELECTBOXDlg::OnBnClickedEnableButton()
{
	GetDlgItem(IDC_DATE_CHECK)->EnableWindow(TRUE);
	GetDlgItem(IDC_TIME_CHECK)->EnableWindow(TRUE);
	m_DateEdit.EnableWindow(TRUE);
	m_TimeEdit.EnableWindow(TRUE);
	// TODO:  在此添加控件通知处理程序代码
}


void CApplicationofSELECTBOXDlg::OnBnClickedDisableButton()
{
	// TODO:  在此添加控件通知处理程序代码
	GetDlgItem(IDC_DATE_CHECK)->EnableWindow(FALSE);
	GetDlgItem(IDC_TIME_CHECK)->EnableWindow(FALSE);
	m_DateEdit.EnableWindow(FALSE);
	m_TimeEdit.EnableWindow(FALSE);
}

第四步编写性别显示按钮的响应函数

这里体现了为什么那些RadioButton要定义为int型变量的原因

调用GetCheckedRadioButton获取选中ID号码,如果选中了该ID则进行copy和级联的操作

注意在VS2012及以上的版本考虑到安全性可能无法直接使用_tcscpy等函数

可以通过在C++预处理器中加入_CRT_SECURE_NO_WARNINGS;指令消除报错

void CApplicationofSELECTBOXDlg::OnBnClickedShowSexAgeButton()
{
	// TODO:  在此添加控件通知处理程序代码
	TCHAR sEdit[50];
	int iSexRADIO;
	int iAgeRADIO;
	iSexRADIO = GetCheckedRadioButton(IDC_BOY_RADIO, IDC_GIRL_RADIO);
	if (iSexRADIO == IDC_BOY_RADIO)
		_tcscpy(sEdit, L"男孩年龄");//相当于strcpy
	if (iSexRADIO == IDC_GIRL_RADIO)
		_tcscpy(sEdit, L"女孩年龄");
	iAgeRADIO = GetCheckedRadioButton(IDC_AGE1_RADIO, IDC_AGE3_RADIO);
	if (iAgeRADIO == IDC_AGE1_RADIO)
		_tcscat(sEdit, L"大于20岁");
	if (iAgeRADIO == IDC_AGE2_RADIO)
		_tcscat(sEdit, L"15到20岁");
	if (iAgeRADIO == IDC_AGE3_RADIO)
		_tcscat(sEdit, L"小于15岁");//相当于strcat
	m_ResultEdit.SetSel(0, -1);
	m_ResultEdit.ReplaceSel(sEdit);
}
第六步显示按钮响应函数编写

与上面第五步没有什么区别

void CApplicationofSELECTBOXDlg::OnBnClickedShowResultButton()
{
	// TODO:  在此添加控件通知处理程序代码
	UpdateData(TRUE);
	TCHAR sCourseEdit[30];
	TCHAR sRecordEdit[15];
	int iCourseRadio;//注意像存储ID的都要定义int型变量
	iCourseRadio = GetCheckedRadioButton(IDC_ENGLISH_RADIO, IDC_NATURE_RADIO);
	if (iCourseRadio == IDC_ENGLISH_RADIO)
		_tcscpy(sCourseEdit, L"英语成绩为");
	if (iCourseRadio == IDC_COMPUTER_RADIO)
		_tcscpy(sCourseEdit, L"电脑成绩为");
	if (iCourseRadio == IDC_NATURE_RADIO)
		_tcscpy(sCourseEdit, L"自然成绩为");
	m_Record.GetWindowText(sRecordEdit, 15);
	_tcscat(sCourseEdit, L"");
	_tcscat(sCourseEdit, sRecordEdit);
	m_ComboEdit = sCourseEdit;
	UpdateData(FALSE);
}

第七步初始化函数的编写

设置初始响应以及组合框下拉列表中应该有哪些东西

SelectString(-1,L"**")为显示默认初始值的成员函数

通过调用UpdateData(TRUE/FALSE)实施更新

BOOL CApplicationofSELECTBOXDlg::OnInitDialog()
{
	CDialogEx::OnInitDialog();
	/**/
	CheckRadioButton(IDC_BOY_RADIO, IDC_GIRL_RADIO, IDC_BOY_RADIO);
	CheckRadioButton(IDC_AGE1_RADIO, IDC_AGE2_RADIO, IDC_AGE2_RADIO);
	UpdateData(TRUE);
	m_English = 0;
	m_SexRadio = 0;
	m_AgeRadio = 0;
	m_Record.AddString(L"85");
	m_Record.AddString(L"90");
	m_Record.AddString(L"95");
	m_Record.SelectString(-1,L"95");//显示默认初始值
	UpdateData(FALSE);

	// 设置此对话框的图标。  当应用程序主窗口不是对话框时,框架将自动
	//  执行此操作
	SetIcon(m_hIcon, TRUE);			// 设置大图标
	SetIcon(m_hIcon, FALSE);		// 设置小图标

	// TODO:  在此添加额外的初始化代码

	return TRUE;  // 除非将焦点设置到控件,否则返回 TRUE
}




  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值