MFC练习4:使用模态对话框

时间:2023-02-13 20:22:18

模态对话框(Modal Dialogue Box,又叫做模式对话框),是指在用户想要对对话框以外的应用程序进行操作时,必须首先对该对话框进行响应。一般来说,Windows应用程序中,对话框分为模态对话框和非模态对话框两种。二者的区别在于当对话框打开时,是否允许用户进行其他对象的操作

基于之前的练习3,我们已经有了一个口令对话框,可以试着将两者进行结合使用。

Ⅰ、添加菜单资源和菜单响应函数

1>在DIALOG resource | Menu | IDR_DIALOGTYPE下打开菜单资源

2>在“查看”下的空白处添加一菜单项,选中Separator使产生一分隔条

3>再添加菜单项并将其ID改为ID_VIEW_MODALDIALOG,在Caption中输入“模态对话框(&M)”

Ⅱ、编辑对话框资源和创建对话框类

1>有上次编辑的基础,我们将对话编辑如下

MFC练习4:使用模态对话框

ID 控件 属性
IDC_SEX1 Radio Button,选中Group
IDC_SEX2 Radio Button
iDC_INTEREST1 Check Box,选中Group 登山
IDC_INTEREST2 Check Box 游戏
IDC_INTEREST3 Check Box 看书
IDC_INTEREST4 Check Box 玩游戏
IDC_COMBO Combo Box  
IDC_EDIT Edit Box  

 

 

 

 

 

 

 

 

 

 

 

  

Ⅲ、添加消息响应函数和代码

1>按下Ctrl+W并在Class name下选中CDialogView,对应的Object IDs选中ID_VIEW_MODALDIALOG,在Message中选COMMAND,最后Add Function(使用默认函数名)

2>类似,在CDialogModal中添加OnInitDialog()、OnOK()和OnCancel()函数

3>在Member Variable里如下进行修改

Control IDs Type Member
IDC_COMBO CComboBox m_Combo
IDC_EDIT CString m_Edit
IDC_SEX1 CButton m_Radio

4>在下列函数写下如是语句,相关的#include "DialogModal.h"记得添加到对应的cpp里去

void CDialogView::OnViewModaldialog() 
{
	// TODO: Add your command handler code here
	CDialogModal m_Dlg;
	m_Dlg.DoModal();
}

void CDialogModal::OnCancel() 
{
	// TODO: Add extra cleanup here
	CDialog::OnCancel();
}

void CDialogModal::OnOK() 
{
	// TODO: Add extra validation here
	CString str;
	str.Empty();
	if(m_Radio.GetCheck())str+="帅哥";
	else str+="美女";
	str+="你好,你的爱好: ";
	BOOL flag=0;
	CButton *p;
	p=(CButton*) GetDlgItem(IDC_INTEREST1);
	if(p->GetCheck())//判断登山是否选中
	{
		str+=" 登山 ";
		flag=1;
	}
	p=(CButton*) GetDlgItem(IDC_INTEREST2);
	if(p->GetCheck())
	{
		str+=" 游泳 ";
		flag=1;
	}
	p=(CButton*) GetDlgItem(IDC_INTEREST3);
	if(p->GetCheck())
	{
		str+=" 看书 ";
		flag=1;
	}
	p=(CButton*) GetDlgItem(IDC_INTEREST4);
	if(p->GetCheck())
	{
		str+=" 玩游戏 ";
		flag=1;
	}
	if(!flag)str+=" 未知 ";
	str+=",学历: ";
	CString tmp;
	int number=m_Combo.GetCurSel();//得到当前被选中的序号
	m_Combo.GetLBText(number,tmp);//获取当前内容
	str+=tmp;
	m_Edit=str;
	UpdateData(false);//更新内容
}

BOOL CDialogModal::OnInitDialog() 
{
	// TODO: Add your command handler code here
	CDialog::OnInitDialog();
	m_Radio.SetCheck(1);//把男设为默认值
	m_Combo.InsertString(0,"小学");//往Combo Box中加入选项
	m_Combo.InsertString(1,"初中");
	m_Combo.InsertString(2,"高中");
	m_Combo.InsertString(3,"大学");
	m_Combo.InsertString(4,"硕士及以上");
	m_Combo.SetCurSel(0);//设置默认值
	return TRUE;
}

5>运行时记得从多文档的“查看”下点击“模态对话框”,当然了,如果要用到之前写过的口令对话框,那就得在CDialogApp::InitInstance()如下写了

CPasswordDialog cDlg;//建立对象
if(cDlg.DoModal()==IDOK)//用户按下确定
{
	if(cDlg.m_Password!=1925)//口令值应为1925
	{
		AfxMessageBox("口令错误,确定后退出。");//口令不对,显示错误信息
		return FALSE;
	}
	else
	{
		CDialogModal cDlg;
		cDlg.DoModal();
	}
}