我有多个进度条,点击第一个按钮时:
void CTDnDlg::OnBtn1() 
{
for(int i=0;i<=100;i++)
{
PeekAndPump();
m_MyProgress1.SetPos(i);
}
}
BOOL PeekAndPump()
{
static MSG msg;
while(::PeekMessage(&msg,NULL,0,0,PM_NOREMOVE))
{
if(!AfxGetApp()->PumpMessage()){
::PostQuitMessage(0);
return FALSE;
}
}
return TRUE;
}
进度条正常显示。
点击第二个按钮时,想让两个进度条一起显示,
void CTDnDlg::OnBtn2() 
{
for(int i=0;i<=100;i++)
{
PeekAndPump();
m_MyProgress2.SetPos(i);
}
}可是我点了第二个按钮,第二个进度条正常显示,第一个停止了。这个怎么解决?

解决方案 »

  1.   

    当OnBtn2正在执行的过程中,OnBtn1不会执行,如果在第二个进度条变化期间点击了第一个按钮,则第一个进度条会修改进度,但是第二个进度条会停止变化直到第一个进度条变化完毕才继续。
    解决方法是:PumpMessage不能解决问题,应该在点击不同按钮时启动不同的定时器,每个定时器负责更新一个进度条状态,这样才能三个进度条同时发生变化。
      

  2.   

    在类中定义四个变量Pos1、Pos2、Increment1、Increment2,都初始化为0。
    void CTDnDlg::OnBtn1()
    {
    Increment1 = 1;
    while (Increment1 + Increment2 != 0)
    {
    PeekAndPump();
    if (Increment1 != 0 && Pos1 <= 100) m_MyProgress1.SetPos(Pos1);
    if (Increment2 != 0 && Pos2 <= 100) m_MyProgress2.SetPos(Pos2);
    if (Pos1 >= 100) Increment1 = 0;
    if (Pos2 >= 100) Increment2 = 0;
    }
    }
    void CTDnDlg::OnBtn2()
    {
    Increment2 = 1;
    }
      

  3.   

    更正:
    void CTDnDlg::OnBtn1() 

    Increment1 = 1; 
    while (Increment1 + Increment2 != 0) 

    PeekAndPump(); 
    if (Increment1 != 0 && Pos1 <= 100) m_MyProgress1.SetPos(Pos1); 
    if (Increment2 != 0 && Pos2 <= 100) m_MyProgress2.SetPos(Pos2); 
    Pos1 += Increment1;
    Pos2 += Increment2;
    if (Pos1 >= 100) Increment1 = 0; 
    if (Pos2 >= 100) Increment2 = 0; 


    void CTDnDlg::OnBtn2() 

    Increment2 = 1; 
    }
      

  4.   

    问题处在函数PumpMessage上了吧,点了第二个按钮时,消息被第二个按钮响应函数中的PeekAndPump()处理掉了,所以进度条一停止。
    可以考虑使用计时器,安装计时器,响应时间消息,达到你想要的效果
    settimer