想问大家个问题
CMyDlg::m_iProgress; //CMyDlg的成员变量CMyDlg::OnBtn()
{
   SetTimer(1,1,NULL);
   
   do{    //循环
       m_iProgress++;
    }
    while(m_iProgress<100);
}CMyDlg::OnTimer()
{
     m_pro.SetPos(m_iProgrss);
}程序是这样 怎么感觉在OnBtn的do while循环之中,OnTimer函数为什么进不去,实现不了进度条循序而进效果

解决方案 »

  1.   

    CMyDlg::OnBtn() 
     { 
           SetTimer(1,1,NULL);
           // 不要用1, 1是1毫秒,1000才是1秒 
     }  CMyDlg::OnTimer() 
     { 
        if ( m_iProgress < 100)
                   m_iProgress++; 
                   m_pro.SetPos(m_iProgrss); 
        }
        else
        {
            KillTimer(1);
        }
     }
      

  2.   

    一毫秒时间间隔太短了   settimer的精度只有55ms 
      

  3.   

    wm_timer消息是要排队的,因为OnBtn实际上是在处理wm_command消息,不返回就表示处理还没结束,也就不会处理wm_timer消息。
      

  4.   


    我感觉和时间没有关系 不管多少都在do while 没有结束的时候 进不去OnTime
      

  5.   

    do while执行的时候程序一直被占用, 不会调用OnTime
      

  6.   

    实现不了进度条循序而进效果具体是怎么?进度条没动还是一下就到满了?
    还有m_iProgress有没有赋初值?
    另外,可能循环体执行完也不用1毫秒,就导致进度条一下就到100了。试一下在循环体里增加sleep,看有没有效果?
      

  7.   

    进不去循环,m_iProgress的初值是多少?设置没有?
      

  8.   

    我觉得 ndy_w 说的对 OnBtn()是在处理WM_COMMAND消息 WM_TIMER消息要排队
      

  9.   

    do{         //循环 
                  m_iProgress++; 
            } 
            while(m_iProgress <100); 关键是在这里,你这里循环100次连1ms都用不了,你让1ms后怎么响应你的OnTimer呢?在循环中加入一个Sleep(100);或者更长时间,才能有可能看到,不过Sleep了之后又会造成消息队列阻塞,也看不到OnTimer响应了,
    只有把循环递加放到线程中去,并且每加一次要适当的Sleep一下.
      

  10.   

    WM_TIMER优先级比较低,其实你想要的效果,去掉循环就可以实现,加上循环无非就是
    在::OnTimer() 函数里面进度条多进一部分
    代码可以这么改,进度条满后,重新开始
    #define nStep 2 //每秒步长
    CMyDlg::OnBtn()  
     {  
      SetTimer(1,1000,NULL); }   CMyDlg::OnTimer()  
     {  
      m_iProgress = (m_iProgress + nStep) %100;
       
      m_pro.SetPos(m_iProgrss);  
      }
      

  11.   

    谢谢 你说的很对 但是我觉得这个问题原因是WM_TIMER要等WM_COMMAND消息