MFC 对话框传参及非模态对话框的隐藏运行、模拟模态对话框的运行方式

       注意:1.所有与窗体、控件的操作的函数都只能在该窗体的相关函数中进行操作,

                2.一个窗体类对象可以对应多个实例的对话框,如果用对话框对象通过对话框函数操纵对话框,将会出现异常,为此,可在对 话框的关联类中定义接口函数,来调用对话框函数完成相应功能。

                3.产生对话框的必须在堆上进行,即用new关键字动态开辟,否则在调用类中的接口时,会出现错误。

                4.MFC采用类和对话框相分离的方式,在尽可能多的情况下不要隐藏运行。

        下面举几个例子:

        (1)两个对话框相互交换数据:

         主要代码如下:

             void CDoModalDlg::OnOK()  //主对话框中的OK按钮
 {
 // TODO: Add extra validation here
   Child=new ChildDlg();     //注意这一句,Chlid是另一个对话框的指针
   /*Child->Create(IDD_Child,this);
   Child->ShowWindow(SW_SHOW);
   CString content;
   AfxMessageBox("OK");*/
    Child->SetDoDlg(this);
 Child->DoModal();
    CString caption;
 Child->GetPath(caption);
    GetDlgItem(IDC_EDIT1)->SetWindowText(caption);
 //CDialog::OnOK();            }

     void ChildDlg::OnOK() //子对话框的OK按钮

{
 // TODO: Add extra validation here
    //GetDlgItem(IDC_EDIT1)->GetWindowText(m_path);
 m_doModalDlg->GetDlgItem(IDD_Parent)->GetDlgItem(IDC_EDIT1)->SetWindowText("HelloWorld!"); //这一句错误
 CDialog::OnOK();
}

 

 

//下面的东西是转载别人的

   

  (1)不用DoModal,自己创建窗口,隐藏运行,模拟DoModal

  1. //在CMainAppApp::InitInstance()中   
  2. CMainAppDlg dlg;   
  3. m_pMainWnd = &dlg;   
  4. dlg.Create(CMainAppDlg::IDD);       //创建窗口   
  5. dlg.ShowWindow(SW_HIDE);            //隐藏运行   
  6. dlg.RunModalLoop();             //模拟DoModal   
  7. return FALSE;  

  

   第二种方法是仿单文档的运行过程,步骤如下:

         1、dlg必须是具有全局生命期的(或者与App的生命期内)有效的变量(App成员变量)
                   或者采用指针动态生成(new CDlg的方式);
         2、InitInstance必须return TRUE;
         3、必须为App的m_pMainWnd赋值如m_pMainWnd = &dlg;
         4、对话框的退出代码中要调用PostQuitMessage(your exit code)或者发送WM_QUIT消息;
         5、如果采用指针动态分配(new CMyDlg)的方式,要记得在ExitInstance中将指针删除;
         本例程采用动态指针生成,至于全局变量的方法相信读者看完本文之后就可以自行实现。
完整代码如下:
  1. //在CMainAppApp::InitInstance()中   
  2. CMainAppDlg *dlg;   
  3. dlg=new CMainAppDlg();                      //新实例   
  4. m_pMainWnd = dlg;   
  5. dlg->Create(CMainAppDlg::IDD,NULL);         //创建窗口   
  6. //dlg->ShowWindow(SW_SHOW);   
  7. dlg->ShowWindow(SW_HIDE);                   //隐藏运行   
  8. dlg->UpdateWindow();   
  9. return TRUE;                                //返回TRUE,启动应用程序的消息泵。  
    1. //采用第二种方法让对话框隐藏运行退出时必须调用PostMessage(WM_QUIT,0,0);   
    2. //否则程序无法退出。   
    3. void CMainAppDlg::OnBnClickedCancel()   
    4. {   
    5.     // TODO: 在此添加控件通知处理程序代码   
    6.     PostMessage(WM_QUIT,0,0);   
    7.     OnCancel();   
    8. }   
    9. void CMainAppDlg::OnBnClickedOk()   
    10. {   
    11.     // TODO: 在此添加控件通知处理程序代码   
    12.     PostMessage(WM_QUIT,0,0);   
    13.     OnOK();   
    14. }   
    15.     
    16. //在ExitInstance 中销毁窗口并释放指针   
    17. int CMainAppApp::ExitInstance()   
    18. {   
    19.     // TODO: 在此添加专用代码和/或调用基类   
    20.     m_pMainWnd->DestroyWindow();   
    21.     delete m_pMainWnd;   
    22.     return CWinApp::ExitInstance();   
    23. }   
 

你可能感兴趣的:(MFC 对话框传参及非模态对话框的隐藏运行、模拟模态对话框的运行方式)