模态对话框和非模态对话框的那点事

                                      模态对话框和非模态对话框的创建方式和值的注意的地方

               一:模态对话框:每次调用模态对话框弹出后,用户只能与该对话框进行交互,而其他用户界面对象接收不到输入信息;

           调用方式比较简单,创建想要弹出对话框类的一个实例,然后调用DoModal()函数即可;
       
          1. 如果想要子窗口的值返回给父窗口,这时可以直接调用子窗口类实例的成员,但可以先用
    if(IDOK==dlg.DoModal())      //DoMadal函数的返回值为IDOK
    {
                              //这里可以添加代码把子窗口的值返回父窗口
     }

           2. 如果想把父窗口的值传递给子窗口,这时可以在创建子窗口类的实例时,把想要的传值作为子窗口类的构造函数中的参数传递。
          做法如下:先改变子窗口类的构造函数,添加第二个参数:(CWnd* pParent = NULL,“添加子窗口接收父窗口传值的变量定义,并初始化”),这个变量可以再在构造函数的定义中把值传给对话框的变量。

               二:非模态对话框:每次调用后,用户还可与其他对话框进行信息交互;

                   非模态对话框中创建的实例不能是普通类型的,因为正常建立的实例dlg是局部变量,在退出对话框时会被销毁,实例销毁同时窗口也销毁,所以会无法显示调用的非模态对话框;
                  正确做法可以是new一个实例指针,于是指针放在堆里,只有在程序结束时才会消亡:先在父类添加子窗口类的指针m_pDlg, 然后
                        m_pDlg=new CModeDlg;          //CModeDlg为子窗口类   
                  m_pDlg->Create(IDD_DIALOG1,this);    //IDD_DIALOG1为子窗口的资源名
                m_pDlg->ShowWindow(SW_SHOW);    //
ShowWindow(SW_SHOW)是改变窗口属性的可见性,当然如果先在子窗口把属性改为可见,就不需要这行代码,但避免忘记,还是加上这行使窗口可见的代码吧。
                    
             注意:我new的指针内存在堆里,程序消亡但内存还没释放,如果没有析构指针,会造成内存泄露
            这时可在Dialog中添加PostNcDestroy函数,用它来释放动态创建时的指针
                                                                                     delete m_pDlg;    //销毁创立的new类型,并防止野指针
                                                                             m_pDlg=NULL;
              提醒:这个PostNcDestroy函数不管有没有调用非模态对话框都会在程序最后调用的,所以如果在使用时没有点击到非模态创立的对话框,会出错,因为在没有点击非模态创立的对话框时,没有动态创建  m_pDlg,就没有为m_pDlg分配内存,但系统都会调用PostNcDestroy来销毁m_pDlg,析构一个没有分配内存的指针,肯定会出错啊。
            


                          
                        

     



     

你可能感兴趣的:(mfc,模态对话框,非模态对话框,PostNcDestroy函数)