我在程序中使用一个模式对话框,让用户填写一些东西后,运行我的一个较花时间的程序,但我发现,这个对话框一直会显示,一直要到我的较大程序运行完毕后,才消失。我的这个较大程序并不在对话框中的,我只是通过对话框得到某些运行参数。我现在想让用户在点击 OK 后,对话框就消失,不知道如何处理?

解决方案 »

  1.   

    OK事件中加入
    CDialog::OnClose()
      

  2.   

    通过此对话框来运行此大程序,我不太清楚
    你试试在调用此程序的函数后添加对话框关闭函数就
    可以了吧(CDialog类派生的应该都可以用OnOk来关闭)
      

  3.   

    我是这样:
      我在菜单中打开了一个对话框,用户填写一个参数后,OK返回。
      我在主程序中就要使用这个参数,并用这个参数进行一个较花
      时间的函数,使用法如下:void CDigitalView::OnInsert() // Insert彩蛋
    {
    CInsertDlg  InsertDlg;        //模式对话框
       
    if (InsertDlg.DoModal()==IDOK)
    {
      if (InsertDlg.m_strFile!="")
        {
            CString strTemp=InsertDlg.m_strInfo;


              DispProgress (strTemp);       // 花时间的函数       
        }
    }
    }
    这里对话框一直在显示,不消失
    我现在就想让它不显示,而显示另外一个进度条窗体。
      

  4.   

    重写OnDestroy();

    void CYourDlg::OnDestroy
    {
      CDialog::OnDestroy();  // 在此添加你的代码
      // 可显示另一个窗口等
    }
    ================================================================CSDN 论坛助手 Ver 1.0 B0402提供下载。 改进了很多,功能完备!★  浏览帖子速度极快![建议系统使用ie5.5以上]。 ★  多种帖子实现界面。 
    ★  保存帖子到本地[html格式]★  监视您关注帖子的回复更新。
    ★  可以直接发贴、回复帖子★  采用XML接口,可以一次性显示4页帖子,同时支持自定义每次显示帖子数量。可以浏览历史记录! 
    ★  支持在线检测程序升级情况,可及时获得程序更新的信息。★★ 签名  ●  
         可以在您的每个帖子的后面自动加上一个自己设计的签名哟。Http://www.ChinaOK.net/csdn/csdn.zip
    Http://www.ChinaOK.net/csdn/csdn.rar
    Http://www.ChinaOK.net/csdn/csdn.exe    [自解压]
      

  5.   

    此乃主体窗口没有更新的缘故。DispProgress (strTemp);不应该放在此处,在此处应放一PostMessage
    然后再WindowProc中调用DispProgress (strTemp)在PostMessage(WM_MYMSG)之前调用Invalidate()即可。
      

  6.   

    CInsertDlg类中的OnOK()函数是怎么写的?CInsertDlg::OnOK()
    {
      CDialog::OnOK();
    }
    或你自己写
    CInsertDlg::OnOK()
    {
      UpdateData(TRUE);
      EndDialog(IDOK);
    }
      

  7.   

    我的感觉就是他要执行完菜单 OnInsert()
    后,窗体才关闭。
      

  8.   

    我的感觉就是他要执行完菜单 OnInsert()
    后,窗体才关闭。
      

  9.   

    就在你调用运行那程序的函数前用OnOK()
      

  10.   

    我來猜一下:    有可能是你的第二個函數導致主窗口來不及刷新。你試著在domadal以後sleep(500).
      

  11.   

    真是好像永不刷新
    我试验了以上各位的方法,都一样
    我都已经改成SendMessage ()
    的方式来执行我教花时间的函数了
    结果还是一样
    我发现:如果我在该函数前加一句 AfxMessageBox ("123");
    那么窗口立刻就消失了。
      

  12.   

    在那个语句前加上Invalidate(),或是干脆把处理过程做成一个工作线程
      

  13.   

    有可能你这个费时程序同时还很耗CPU。
    试一下先Invalidate,然后post自定义消息,在消息处理程序中做该耗时工作
      

  14.   

    用SendMessage 程序可以工作用PostMessage 程序就出错。
    这是为什么?
      

  15.   

    跟踪发现:
       使用PostMessage 参数没有传递过来   为什么??
      

  16.   

    改成PostMessage还是不刷新。
    现在我已经改成这样
     定义一个全局变量在头文件中
    Info 结构
    void CDigitalView::OnInsert() // Insert彩蛋
    {
    CInsertDlg  InsertDlg;        //模式对话框
       
    if (InsertDlg.DoModal()==IDOK)
    {
      if (InsertDlg.m_strFile!="")
        {
            Info.strInfo=InsertDlg.m_strInfo;
            Info.nNum=InsertDlg.m_nNum;
              
        }
    }PostMessage (WM_DISPPTROGRESS,0,(LPARAM )&Info);         
    }然后处理消息,函数运行正常,可惜就是不刷新。难道只有使用线城了?   
      

  17.   

    PostMessage (WM_DISPPTROGRESS,0,(LPARAM )&Info);         
    之前Invalidate()一下
      

  18.   

    void CDigitalView::OnInsert() // Insert彩蛋
    {
    CInsertDlg  InsertDlg;        //模式对话框
       
    if (InsertDlg.DoModal()==IDOK)
    {
      if (InsertDlg.m_strFile!="")
        {
            CString strTemp=InsertDlg.m_strInfo;


              DispProgress (strTemp);       // 花时间的函数       
        }
    }
    }
    你直接在这个函数前加上显示进度条的代码,不行吗?
      

  19.   

    alanwang_(alan 你说的方法我已经试验过,效果一样。都不刷新。 goodsong(如风) 直接在该函数前加 有进度条的窗体。会出现,该窗体
     在函数运行完之前,显示的是一片灰色。也就是根本没有显示出进度条 进度条:我不想让进度条是由Timer 来控制。我想在DispProgress ()中加入一些消息,然后发给有进度条的窗体,这样来达到真正的进度条显示。当然,现在我还没有加消息,我现在只是希望这个有进度条的窗体正常显示出来