自定义了CMyDialog类,与一个模式对话框关联,在别的视图类里要调用这个对话框,代码如下:
CMyDialog dlg;
dlg.DoModal();
Sleep(2000);  //让对话框显示两秒钟
dlg.EndDialog(2);调用EndDialog应该可以关闭对话框了,可是对话框没有消失,不知怎样才能关闭它?是不是我的用法有误?谢谢大家了!

解决方案 »

  1.   

    请注意以下事实:
    CMyDialog dlg;
    dlg.DoModal();--》程序运行到此处,主线程将被阻塞!如果调试的话,断点将停止。必须等待dlg对话框退出后才会继续向下运行!所以你的Sleep(2000)和dlg.EndDialog(2)在对话框关闭前根本就不会被调用!所以以下两句话毫无意义。你对模式和非模式的还非常不了解。
    Sleep(2000);  //让对话框显示两秒钟
    dlg.EndDialog(2);
      

  2.   

    关注。应当是对的。MSDN上的:
    // MyWnd.cpp
    #include "MyDialog.h"void CMyWnd::ShowDialog()
    {
       CMyDialog myDlg;
       int nRet = myDlg.DoModal();   if ( nRet == IDOK || nRet == 5  )
          AfxMessageBox("Dialog closed successfully");
    }// MyDialog.cpp
    void CMyDialog::OnSomeAction()
    {
       // Do something   int nRet = 5; // Just any value would do!
       EndDialog(nRet); // This value is returned by DoModal!   // Do something   return; // Dialog closed and DoModal returns only here!
    }
      

  3.   

    第二个函数的意思是要你触发一个事件,比如WM_CHAR,所以函数二的名字现在应该是
    void CMyDialog::OnChar()
      

  4.   

    void CMyDialog::OnSomeAction()
    楼上,请搞清楚了,你说的EndDialog是在这个对话框内部调用的!这当然没有问题了。可楼主说的EndDialog是在对话框外部调用的,不是一回事。
      

  5.   

    哦,觉得 happyparrot(快乐鹦鹉)说的应该是理了,谢谢先!
    可是如果我只能用模式对话框,有没有办法实现让其自动关闭啊?
      

  6.   

    一般的办法是可以开线程来关闭它。
    我刚才测试了一个办法。用定时器来关闭它。比如你的程序可以这样改:
    首先将CMyDialog dlg这个变量定义成定时器事件中可以获取到的变量。比如,你这段程序是在视图类里面调用的,那么将dlg定义为视图类的成员变量。然后修改:
    SetTimer(1,2000,NULL);设置2秒定时器
    dlg.DoModal();
    KillTimer(1);//取消定时器定时器事件中这样:
    void CMDITestView::OnTimer(UINT nIDEvent) 
    {
    if(dlg.m_hWnd != NULL )
    EndDialog(dlg.m_hWnd,2);
    CScrollView::OnTimer(nIDEvent);
    }这样可以关闭对话框。但可能还有别的问题出现。
      

  7.   

    sleep(2000)根本就没执行,你要真的想在对话框外结束他,那就应该开一个线程去domodal
      

  8.   

    用定时器,Timer,在回调函数中关闭对话框
      

  9.   

    突然意识到
    我对操作的判断比如说if(btool==FALSE)是跟在dlg.DoModal()之后的,按照happyparrot(快乐鹦鹉)大侠所说,就根本执行不到这个 if语句了,那究竟该怎么办呢?
      

  10.   

    没这么难啊
    别用 EndDialog函数就行了.....
    用别的 OnOK  OnCancel 一堆呢
      

  11.   

    搞定了,要用模式对话框,且不能用定时器的话,加线程搞定了,在线程函数里对我的操作进行处理即可,同样也是在线程函数里SendMessage来关闭对话框