模态对话框和非模态对话框

分类:

模态对话框工作状态:当它获得焦点时,将垄断用户的输入,在完成本对话框之前,用户无法对本程序的其他部分进行操作。

非模态对话框类似于WORD里的查找替换,就在应用程序打开非模态对话框的同时还可以切换到其他窗口进行操作。

二者的类都派生于CDialog类,而CDialog类派生于CWnd类。

区别:

模态对话框使用CDialog::DoModal函数创建以及销毁。初始化消息WM_INITDIALOG,调用OnInitDialog初始化并显示,创建完毕后,DoModal启动消息循环。DoModal运行时候,程序会停止在新对话框的消息循环函数中,不执行其他线程程序。

创建模态对话框:

 dig1 mark;

if(mark.DoModal()==IDOK){

      

}

return FALSE;

 

非模态对话框使用CDialog::Create实现。由于Create函数不会启动新的消息循环,对话框与应用程序共用一个消息循环,就不会独占用户输入,Create函数在对话框显示后就立即返回。DoModal是在对话框关闭后才返回。对话框关闭后说明对话框窗口的对象已经销毁,只剩下C++对象还没有释放,所以必须调用CWnd::DestoryWindows函数来关闭非模态对话框。

开启非模态对话框方法:注意一点,非模态对话框需要全局对象,否则对象内存会被撤销,在生命周期结束的时候。

dig1 mark;

mark.Create(IDD_CLASS_ID,this);

mark.ShowWindow(SW_SHOW);

这里注意一点:因为关闭非模态对话框的同时,只是隐藏了对话框,没有销毁创建的对话框的资源,所在再次创建的时候,会报错。

void Cdlg::OnOk()

{

      if(!IsWindow(m_Dlg,m_hWnd))//是否关联了对话框

     {

           mdlg.Create(IDD_CLASS_ID,this);//创建非模态对话框

      }

      m_Dlg.ShowWindow(SW_SHOW);//显示非模态对话框

}

 

撤销非模态对话框方法:

mark.DestoryWindow();

 

 

模态对话框的创建

环境:VC6.0/VS2005

功能:程序界面出现之前弹出一个密码对话框,输入密码,密码正确继续执行,密码错误程序终止。

VC6.0

 

 

Dialognew一个新的对话框

 

更改属性:

界面加入控件:

Static TextButtonEdit Box

 

Edit Box属性

创建对话框类

 

 

 

在类CpasswordDialogControl IDsIDC_PASSWORD_EDIT添加两个Member Variables

 

代码添加:

要求密码对话框在程序一开始运行就弹出,所以在应用程序类C**_App类的InitInstance()函数中进行口令检查。

 

BOOL CMy1App::InitInstance()

{

       AfxEnableControlContainer();

 

       // Standard initialization

       // If you are not using these features and wish to reduce the size

       // of your final executable, you should remove from the following

       // the specific initialization routines you do not need.

 

#ifdef _AFXDLL

       Enable3dControls();                     // Call this when using MFC in a shared DLL

#else

       Enable3dControlsStatic();      // Call this when linking to MFC statically

#endif

      

       CpasswordDialog m_dlg1;          //定义CpasswordDialog类实例m_dlg1;

       if(m_dlg1.DoModal()==IDOK)   //如果按下确定

       {

              if(m_dlg1.m_Password!=1987)//判别输入口令是否正确

              {

                     MessageBox(NULL,"口令错误","错误",MB_OK|MB_ICONERROR);

                     return FALSE;

              }

       }

       else

              return FALSE;

 

       CMy1Dlg dlg;

       m_pMainWnd = &dlg;

       int nResponse = dlg.DoModal();

       if (nResponse == IDOK)

       {

              // TODO: Place code here to handle when the dialog is

              // dismissed with OK

       }

       else if (nResponse == IDCANCEL)

       {

              // TODO: Place code here to handle when the dialog is

              // dismissed with Cancel

       }

 

       // Since the dialog has been closed, return FALSE so that we exit the

       // application, rather than start the application's message pump.

       return FALSE;

}

并添加头文件

#include "passwordDialog.h"

消息响应函数

Class name:CpasswordDialog

Object IDs:IDC_PASSWORD_EDIT

Messages:EN_CHANGE

函数名:OnChangePasswordEdit

 

 

源程序的变化:

第一向头文件passworddialog.h添加OnChangePasswordEdit()成员函数原型声明,afx_msg说明此函数说明是被消息映射驱动的成员函数。

第二是向实现文件passworddialog.cpp的消息映射宏里添加了EN_CHANGE消息与成员函数OnChangePasswordEdit.

第三实在passworddialog.cpp中添加了成员函数OnChangePasswordEdit()的定义。

OnChangePasswordEdit()代码编辑

void CpasswordDialog::OnChangePasswordEdit()

{

       // TODO: If this is a RICHEDIT control, the control will not

       // send this notification unless you override the CDialog::OnInitDialog()

       // function and call CRichEditCtrl().SetEventMask()

       // with the ENM_CHANGE flag ORed into the mask.

      

       // TODO: Add your control notification handler code here

       CString temp;

       int length1,length2;

       length1 = m_Edit1.GetWindowTextLength();//获取输入的字符个数

       if(length1==4)

       {

              m_Edit1.GetWindowText(temp); //获取文本框中的全部字符

              length2 = temp.Find("1987"); //检查输入的字符是否为指定口令

              if(length2!=0)

              {

                     MessageBox("口令错误,退出程序","错误",MB_OK|MB_ICONERROR);

              }

       }

      

}

运行结果:

 

 

你可能感兴趣的:(VC)