您的位置:首页 > 编程语言

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

2016-07-03 20:17 260 查看
组合框顾名思义既可以输入又可以选择就叫做组合框

组合框的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
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: