文档介绍:踏雪无痕
vc的模态对话框和非模态对话框
分类: C++ 2011-08-30 14:38 279人阅读评论(0) 收藏举报
Generally Speaking
(1)创建一非模态对话框 
  CMyDlg*   pMainWnd   =   new   CMyDlg; 
  pMainWnd->Create(); 
  (2)创建一模态对话框 
  CMyDlg   dlg; 
  (); 
  
  非模态的对话框是独立的,就是说和主程序可以同时交换数据,而模态的对话框则只能和自己交换。换句话说,
模态对话框很霸道,你开了它就无法在同一个应用程序中的其他地方干活了,比如那个经常用的openfile dialog。
非模态对话框就很随和,开了它你还可以爱干嘛干嘛。还有一个区别在于内存分配,new在堆中,另一在栈中,一般说
两者一样,但如果你在对话框中开了很大的空间做成员,第二种就会有问题了,因为栈空间是受限的。但据说解决栈溢
出用static申明,在全局数据区分配内存就可以了(我没试过)!模态消息不进message   loop;非模态消息进入
message   loop。  
  
如何使用vc的非模态对话框
1、非模态对话框的模板必须具有Visible风格,否则对话框将不可见,而模态对话框则无需设置该项风格。更保险
的办法是调用CWnd::ShowWindow(SW_SHOW)来显示对话框,而不管对话框是否具有Visible风格。
2、非模态对话框对象是用new操作符在堆中动态创建的,而不是以成员变量的形式嵌入到别的对象中或以局部变量
的形式构建在堆栈上。通常应在对话框的拥有者窗口类内声明一个指向对话框类的指针成员变量,通过该指针可访
问对话框对象。
3、*通过调用CDialog::Create函数来启动对话框,而不是CDialog::DoModal,这是模态对话框的关键所在。由于
Create函数不会启动新的消息循环,对话框与应用程序共用同一个消息循环,这样对话框就不会垄断用户的输
入。Create在显示了对话框后就立即返回,而DoModal是在对话框被关闭后才返回的。众所周知,在MFC程序中,窗
口对象的生存期应长于对应的窗口,也就是说,不能在未关闭屏幕上窗口的情况下先把对应的窗口对象删除掉。由
于在Create返回后,不能确定对话框是否已关闭,这样也就无法确定对话框对象的生存期,因此只好在堆中构建对
话框对象,而不能以局部变量的形式来构建之。
4、代码示例:
对话框资源ID为:IDD_MYDIALOG
对话框的类定义为:CMyDialog
CMyView的成员变量为:CMyDialog* m_myDlg
CMyView::OnOpenDialogButton()
{
  CMainFrame* pWnd=(CMainFrame*)AfxGetMainWnd();
  ASSERT_VALID(pWnd);    //定义父窗口指针pWnd
  m_myDlg=new CMyDialog(pWnd);    //堆分配非模态对话框内存空间,   //CMyDialog(CWnd* pParent=NULL)为
构造函数