模态对话框(Modal Dialogue Box,又叫做模式对话框),是指在用户想要对对话框以外的应用程序进行操作时,必须首先对该对话框进行响应。一般来说,Windows应用程序中,对话框分为模态对话框和非模态对话框两种。二者的区别在于当对话框打开时,是否允许用户进行其他对象的操作。
基于之前的练习3,我们已经有了一个口令对话框,可以试着将两者进行结合使用。
Ⅰ、添加菜单资源和菜单响应函数
1>在DIALOG resource | Menu | IDR_DIALOGTYPE下打开菜单资源
2>在“查看”下的空白处添加一菜单项,选中Separator使产生一分隔条
3>再添加菜单项并将其ID改为ID_VIEW_MODALDIALOG,在Caption中输入“模态对话框(&M)”
Ⅱ、编辑对话框资源和创建对话框类
1>有上次编辑的基础,我们将对话编辑如下
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(); } }