设计一个“学生成绩操作”对话框,当单击“添加”按钮时,弹出“学 生成绩输入”对话框,输入数据后,学号添加到组合框中,选择组合框中的学号后,学生数据在列表框中显示出来。
操作过程如下:
1.启动VC+6.0,创建一个基于MFC的单文档应用程序Ex_Ctrls
在单文档中添加对话框的方法为
点击菜单栏上的插入------资源----Dialog
2.添加并设计“学生成绩输入”对话框 添加一个新的对话框资源,将 ID 号改为 IDD_INPUT,标题为“学生成绩输入”,对话 框字体改为“宋体,9 号”。将OK 和 Cancel 按钮标题改为“确定”和“取消”
3.向对话框内添加组件,布局如下:
ID的修改如下所示:
4. 按 Ctrl+W 快捷键,打开 MFC Wizard 对话框,修改 ClnputDlg 代码以及添加成员变量,为按钮 IDOK 添加 BN_CLICKED 消息映 射,并添加下列学生姓名和学号的判断代码
添加成员变量:
添加消息映射:
void CinputDlg::OnOK()
{
UpdateData( );
m_strName.TrimLeft( );
m_strNo.TrimLeft( );
if(m_strName.IsEmpty())
MessageBox("学生姓名不能为空!");
else
if(m_strNo.IsEmpty())
MessageBox("学生学号不能为空!");
else
CDialog::OnOK();
}
输入代码后,编译无误
5.
1)新添加对话框资源 ID_EX_CTRLS_DIALOG。
2)删除对话框中的默认静态文本控件和“取消”按钮,将对话框的标题改为“学生成 绩操作”,将“确定”按钮标题改为“退出”。
3)参照图 16 所示的控件布局,添加一个“添加”按钮,标识符为 IDC_STU_ADD. 4)添加一个列表框控件,保留默认的标识符 IDC_LIDTl,去掉 Sort 属性选项前面的选 中标记。
5)添加一个组合框控件,保留默认的标识符 IDC_COMBO1。
6)添加其他静态文本控件,调整对话框大小。
6.按 Ctrl+W 快捷键,打开 MFC Wizard 对话框,为列表框件 IDC_LIST1 添加控件变量 m_List, 为型为 Clist Box。为组合框控件 IDC_COMBO1 添加控件变量 m_Combo,类型为 CcomboBox.(跟前面的步骤相似)
用 MFC Wizard 为按钮 IDC_STU_ADD 添加 BN_CLICKED 消息映射,并添加下列代 码,调试无错误。
void CEx_CtrlsDlg::OnStuAdd()
{
CinputDlg dlg;
if(IDOK==dlg.DoModal())
{
// 判断组合框中有无重复的学号存在
if(m_Combo.FindString(-1, dlg.m_strNo)<0)
{
int nIndex=m_Combo.AddString(dlg.m_strNo);
STUDATA data;
data.strName=dlg.m_strName;
data.strNo=dlg.m_strNo;
data.fScore1=dlg.m_fScore1;
data.fScore2=dlg.m_fScore2;
data.fScore3=dlg.m_fScore3;
m_Combo.SetItemDataPtr(nIndex, new STUDATA(data));
}
m_Combo.SetCurSel(0);
OnChangeCombo();
}
}
7.打开 Ex_CtrlsDlg.h 文件,在 class CE_CtrlsDlg 语句前面添加下列数据结构定义
在 Ex_CtrlsDlg.cpp 文件的前面添加 CinputDlg 的包含语句:
#include “Ex_Ctrls.h”
#include “Ex_CtrlsDlg.h”
#include “InputDlg.h” ,并编译并运行
8.用 MFC Wizard 为组合框 IDC_COMBO1 添加 CBN_SELCHANGE 消息映射,将其映函数改为 OnChangeCombo,并添加下列代码:
HCURSOR CEx_CtrlsDlg::OnQueryDragIcon()
{
return (HCURSOR) m_hIcon;
}
void CEx_CtrlsDlg::OnStuAdd()
{
CinputDlg dlg;
if(IDOK==dlg.DoModal())
{
// 判断组合框中有无重复的学号存在
if(m_Combo.FindString(-1, dlg.m_strNo)<0)
{
int nIndex=m_Combo.AddString(dlg.m_strNo);
STUDATA data;
data.strName=dlg.m_strName;
data.strNo=dlg.m_strNo;
data.fScore1=dlg.m_fScore1;
data.fScore2=dlg.m_fScore2;
data.fScore3=dlg.m_fScore3;
m_Combo.SetItemDataPtr(nIndex, new STUDATA(data));
}
m_Combo.SetCurSel(0);
OnChangeCombo();
}
}
void CEx_CtrlsDlg::OnChangeCombo()
{
int nIndex=m_Combo.GetCurSel();
if(nIndex!=CB_ERR )
{
m_List.ResetContent();
STUDATA*data;
data=(STUDATA*)m_Combo.GetItemDataPtr(nIndex);
CString str;
str="姓名:" +data->strName;
m_List.AddString(str);
str="学号:" +data->strNo;
m_List.AddString(str);
str.Format("成绩 1:%4.1f, 成绩 2:%4.1f, 成绩 3:%4.1f",data->fScore1 ,data->fScore2, data->fScore3);
m_List.AddString(str);
}
}
9.用MFC ClasWizard 为对话框 CEx_CtrlsDlg 添加 WM_DESTROY 的消息映射,并添加下列代码,用来删除所有与组合框中列表项目相关联的 STUDATA 结构数据,并释放内存
void CEx_CtrlsDlg::OnDestroy()
{
for(int nIndex = m_Combo. GetCount( )-1; nIndex>=0; nIndex--)
delete(STUDATA *)m_Combo.GetItemDataPtr(nIndex);
CDialog::OnDestroy( );
}
最终的运行结果如下: