#include "A2Dlg.h"
……
CA1Dlg:::OnTimer(UINT_PTR nIDEvent)
{
 CDialog::OnTimer(nIDEvent);
 
 Fn();
}
void CA1Dlg::Fn(void)
{
  while(m_bTrue1)
 { 
    while(m_bTrue2)
   {
     if(m_bTrue3)
      {  
         CA2Dlg dlg;
         dlg.DoModal();
         return;
      }
    }  
  }
}请各位大哥帮我看看这段代码,进入函数Fn()后,程序就一直跳不出来了,return语句好象无法返回。所以就一直不端的弹出CA2Dlg  的对话框。请问怎么样才能在弹出第一个对话框后,就跳出所有的while循环体,继续下一个OnTimer检查??

解决方案 »

  1.   

    改变m_bTrue1和m_bTrue2的值,才能行,不然是永真的情况,当然一直碰,得有一个假的条件才行!
      

  2.   

    这种情况要用非模态对话框:
    CA2Dlg* dlg = new CA2Dlg;
    dlg->Create(对话框资源ID);
    dlg->ShowWindow(SW_SHOW);
    再在CA2Dlg类中响应WM_CLOSE消息,调用DestroyWindow函数;重载PostNcDestroy函数,delete this。
      

  3.   

    我这两个bool值代表从一个list中遍历是否有匹配的值,一旦找到有这样的值就弹出对话框。这个条件写起来有点复杂。
      

  4.   


    大哥能具体解释下  为什么return返回不了呢?为什么要这样才能解决呢?
      

  5.   

    我刚试了下cnzdgs的方法,仍然不断弹出对话框  貌似问题还没解决
      

  6.   

    总觉得你这样设计有问题,OnTimer本来就是一个消息循环了,而你在其里面又加了循环,不知道你的用意是什么,把while都改成if吧
      

  7.   

    刚又实验了下,的确不再弹出了。但是正如cnzdgs所说的那样,无法关闭这个对话框,我添加了WM_CLOSE消息的啊   望各位指点  不够再加分
      

  8.   

    比较笨的方法,当弹出这个对话框时把就用KillTimer,当对话框关闭的时候再SetTimer
      

  9.   

    一旦进入if(m_bTrue3)语句,是不是应该将m_bTrue1、m_bTrue2置为false;
    再者,非模态对话框关闭时要用delete删除。
      

  10.   

    dlg = new CA2Dlg(); 
    dlg->Create(对话框资源ID); 
    dlg->ShowWindow(SW_SHOW); 
    KillTimer(nEvent);CA2Dlg* dlg设置为全局的
      

  11.   

    DoModel是显示模态对话框,对话框关闭后才返回,才会执行DoModel后面的代码,所以在这里加return是没用的。
    DoModel里面有消息循环,因为你没有停止定时,所以还会继续产生定时消息,执行定时函数,如果定时函数中判断的条件没有变,自然就又执行到显示对话框的代码了。这是程序的逻辑问题。
      

  12.   

    你这个是OnTimer在不断的执行,一个条件符合后,弹出窗口,你没有中止TIMER,又在触发消息,以致弹出N多了。致使候死,可以
    pDlg= new CA2Dlg(); 
    dlg->Create(对话框资源ID); 
    dlg->ShowWindow(SW_SHOW); 
    条件改变,以防重复判断。()...在CA2Dlg类中PostNcDestroy函数,delete this
      

  13.   

    为什么设置这么多值为true的变量呀,这样做很容易死循环的
      

  14.   

    这种类似的问题我也碰过。
    其实我认为用一个While循环就可以了。
    直接就
    While(m_bTrue1 && m_bTrue2)
    {
       if{m_bTrue1||m_bTrue2||m_bTrue3}
       {
         return;//这里提前作处理,更好一点样的。
       }
       if{m_bTrue3)
       { 
          //想办法随便改变一下m_bTrue1 或m_bTrue2,m_bTrue3的值
          m_bTrue1=False;
          m_bTrue2=Fales;
          CA2Dlg dlg;  
          dlg.DoModal();
         // return;//这句只有在dlg关闭后才能返回。应该是费CODE;
       }
    }
    具体要怎样,看你程序的功能了。