1. 模态对话框和非模态对话框:
a. 模态对话框:
i. 强制要求用户立刻相应对话框,只有完成该对话框操作后才能对其它对话框进行操作;
ii. Word的“打开”对话框就是一个典型的模态对话框,只有确定打开的文件后才可以对该文件进行其它操作(即对其它对话框进行操作);
b. 非模态对话框:
i. 和模态对话框刚好相反,允许和其它对话框同时接受用户操作;
ii. Word的“查找和替换”对话框就是典型的非模态对话框;
.........以下简单介绍模态对话框编程:
2. 在菜单栏的查看选项中添加一个名为“学生信息管理”的选项,并且ID定为IDM_SUTDENTMANAGEMENT,该选项的作用就是打开“学生信息管理”对话框;
3. 视图中添加显示对话框中用户输入数据的功能:
a. 视图就是运行程序时面积最大的那个白色的区域;
b. 该类由CTestView类进行管理,在这里我们将用视图把对话框中输入的数据显示出来;
c. 策略是在CTestView类中建立一个用来响应来自“学生信息管理”菜单项的WM_COMMAND消息的响应函数;
d. 方法:在菜单项"学生信息管理"上右键→建立类向导→类名改为CTestView(即设定响应来自该项的消息的类为CTestView类)→选择消息是COMMAND→Add Function→响应函数名为OnStudentManagement→进入该函数的编辑区域;
e. 既然要在视图中显示对话框中的数据,那么必须要在视图类中定义响应的变量用于接收对话框中的变量值,因此需要在CTestView类中添加变量;
f. 策略:直接在视图类中添加一个对话框类对象,直接由视图类来打开一个对话框;
g. 方法:资源视图→在CTestView类上右键→Add Member Variable→输入类型为CStudentDlg,名称为m_stuDlg;
h. 用同样的方法在CTestView类中添加变量:
m_stuName用于接收对话框中的变量m_stuDlg.m_name,CString;
m_stuID用于接收对话框雷中的变量m_stuDlg.m_ID,CString;
m_stuGrade接收m_stuDlg.m_grade,int;
m_stuCourse接收m_stuDlg中m_english等课程字符串,CString;
m_stuDuty接收m_stuDlg.m_duty,CString;
m_stuMajor接收m_stuDlg.m_major,CString;
I. OnStudentManagement函数实现:
void CTestView::OnStudentManagement()
{
// TODO: Add your command handler code here
if (IDCANCEL == m_stuDlg.DoModal())
return ;
//DoModal函数用于创建并显示一个模态对话框
//也就是当用户点击“学生信息管理”菜单项后向CTestView类对象发出WM_COMMAND消息
//然后CTestView类对象的OnStudentManagement函数响应该消息
//当执行到DoModal函数时屏幕就会显示一个模态对话框
//该函数返回值就是用户选择了OK按钮还是CANCEL按钮,即返回值为这两个按钮的ID号
//可见,当调用DoModal函数后,用户会先在对话框中填写相关内容,
//只有当用户填完并选择了OK或者CANCEL后该函数才会执行完毕并返回结果
//在设计对话框时已经将OK按钮的ID改为IDOK,将CANCEL按钮的ID改为IDCANCEL
//如果用户选择了CANCEL则不能更新对话框中的相关数据,因此直接退出函数即可(即直接return)
//因为DoModal函数需要创建对话框,因此会在这个函数中调用m_stDlg.OnInitDialog函数
//用于初始化列表框和组合框中的内容
//既然用户选择了OK按钮,则可以将填入的内容写入对话框的成员变量中了
UpdateData();
//该函数之前讲过,里面调用了CTestView类的DoDataExchange用于将对话框中填入的内容写入对话框的成员变量中
//但是该函数本身却是属于CTestView类的,从这里可以看出控件属于对话框,但是在控件上填写的内容是属于视图的
//该函数的参数是BOOL类型的,默认情况下的参数就是TRUE,因此不写任何实参就代表传入的是TRUE
//TRUE表示将填入内容写入对话框的变量中,FALSE表示将对话框中的内容显示到对话框中的响应控件上
//待用户填完并OK退出对话框之后将各个对话框的变量接受之,然后将其显示到视图区域中
if ("" == m_stuDlg.m_name)
{
MessageBox("姓名不能为空!");
return ;
}
else
m_stuName = "姓名为:" + m_stuDlg.m_name;
if ("" == m_stuDlg.m_ID)
{
MessageBox("学号不能为空!");
return ;
}
else
m_stuID = "学号为:" + m_stuDlg.m_ID;
if (-1 == m_stuDlg.m_grade)//单选按钮默认初始化为-1,即没有一个单选按钮被选中
{
MessageBox("请选择年级!");
return ;
}
else
{
m_stuGrade = "所在年级:大";
switch (m_stuDlg.m_grade)
{
case 0 :
m_stuGrade += "一";
break;
case 1 :
m_stuGrade += "二";
break;
case 2 :
m_stuGrade += "三";
break;
case 3 :
m_stuGrade += "四";
break;
default :
break;
}
}
m_stuCourse = "";
if (m_stuDlg.m_english)
m_stuCourse += "英语 ";
if (m_stuDlg.m_math)
m_stuCourse += "数学 ";
if (m_stuDlg.m_physics)
m_stuCourse += "物理 ";
if (m_stuDlg.m_clanguage)
m_stuCourse += "C语言 ";
if (m_stuDlg.m_philosophy)
m_stuCourse += "哲学 ";
if (m_stuDlg.m_art)
m_stuCourse += "艺术";
if ("" == m_stuCourse)
{
MessageBox("请选择您的课程!");
return ;
}
else
m_stuCourse = "所选课程:" + m_stuCourse;
if ("" == m_stuDlg.m_duty)
{
MessageBox("请选择您的职务!");
return ;
}
else
m_stuDuty = "班级职务为:" + m_stuDlg.m_duty;
if ("" == m_stuDlg.m_major)
{
MessageBox("请选择您的专业!");
return ;
}
else
m_stuMajor = "专业为:" + m_stuDlg.m_major;
Invalidate();//发出WM_PAINT消息,通知将整个视图区域重绘
}
J. Invalidate函数会通知OnDraw函数对视图区域进行重绘,因此需要修改OnDraw函数,使其在视图区域中显示对话框中的相关信息:
void CTestView::OnDraw(CDC* pDC)
{
CTestDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
pDC->TextOut(0, 0, m_stuName);
pDC->TextOut(0, 20, m_stuID);
pDC->TextOut(0, 40, m_stuGrade);
pDC->TextOut(0, 60, m_stuCourse);
pDC->TextOut(0, 80, m_stuDuty);
pDC->TextOut(0, 100, m_stuMajor);
}