九、模态以及模态对话框编程简介

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);
}


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值