本帖最后由 xianglitian 于 2010-09-05 19:47:31 编辑

解决方案 »

  1.   

    不改这样写在按钮点击消息里用
    SetTimer(IDNum/*这是你设置的定时器的ID*/,1000/*这是定时器的频率*/,NULL);然后在OnTimer里通过判断nIDEvent==IDNum来判断是哪个定时器的工作
      

  2.   


    在按钮点击消息里用
    SetTimer(IDNum,1000,NULL);
    这样吗?
    然后在OnTimer里通过判断
    if(nIDEvent==1)
    {
      ...//
    }
    不太理解您的意思?
      

  3.   


    我刚才重新改过代码,直接在按钮的响应函数中添加代码void CPUMPView::OnBtnP1()
    {
        MessageBox("开启泥泵" );
        m_isclick = TRUE;
        SetTimer(1,1000,NULL);
        IDNum = 1;
    }
    void CPUMPView::OnBtnP2()
    {
        MessageBox("关闭泥泵" );
        m_isclick = FALSE;
        IDNum = 1;
    }
    void CPUMPView::OnBtnP3()
    {
        MessageBox("增加泥泵转速" );
        SetTimer(2,500,NULL);    
    }
    这样的效果我可以实现我的一部分要求,譬如说点击第三个按钮直接调用第二个定时器,但是我想再点击按钮3继续调用第三个定时器就不知道怎么解决了?请问怎么弄?
      

  4.   

    你添加了时间消息响应了吗 wm_timer
      

  5.   

    你要用SetTimer函数设置定时器,每个定时器的ID不应该一样,然后在OnTimer函数里通过判断nIDEvent==定时器ID 来改变定时器的运行函数
      

  6.   

    比如说你可以在你的按钮点击函数中这样设置:
    首先初始化IDNum=1;
    void CPUMPView::OnBtnP1()
    {
        MessageBox("开启泥泵" );
        SetTimer(IDNum,1000/*这是定时器的频率*/,NULL);    
    }
    void CPUMPView::OnBtnP2()
    {
        MessageBox("关闭泥泵" );
        SetTimer(IDNum++,1000/*这是定时器的频率*/,NULL);    
    }
    void CPUMPView::OnBtnP3()
    {
        MessageBox("增加泥泵转速" );
        SetTimer(IDNum++,1000/*这是定时器的频率*/,NULL);     
    }再在OnTimer中:
     if(nIDEvent== 1)   //判断是第一个定时器
        {
            =1;
            n++;
            CRect rect(0,0,250,768);
            InvalidateRect(&rect);
            
        }
         if(nIDEvent == 2)  //第2个
        {
    //        KillTimer(1);
            nIDEvent=2;
            n++;
            CRect rect(0,0,250,768);
            InvalidateRect(&rect);
            
        }
         if(nIDEvent == 3)  //第3个
        {
            
    //        KillTimer(1);
    //        KillTimer(2);
            nIDEvent=3;
            n++;
            CRect rect(0,0,250,768);
            InvalidateRect(&rect);
            
        }
      

  7.   


    你的意思我理解,但是我怎么在Button的单击函数中调用不同的定时器呢?我原先代码如下。
    int CPUMPView::OnCreate(LPCREATESTRUCT lpCreateStruct) 
    {
    if (CView::OnCreate(lpCreateStruct) == -1)
    return -1;

    // TODO: Add your specialized creation code here
    SetClassLong(m_hWnd,GCL_HBRBACKGROUND,(LONG)GetStockObject(BLACK_BRUSH));
    //添加定时器设置
    SetTimer(1,1000,NULL);
    SetTimer(2,500,NULL);
    SetTimer(3,100,NULL);
    return 0;
    }而ontimer函数代码如下:
            if(nIDEvent==1)
    {
    n++;
    CRect rect(0,0,250,768);
    InvalidateRect(&rect);

    }
     if(nIDEvent==2)
             {
    n++;
    CRect rect(0,0,250,768);
    InvalidateRect(&rect);

    }
     if(nIDEvent == 3)
    {
    n++;
    CRect rect(0,0,250,768);
    InvalidateRect(&rect);

    }
    n++;
    CRect rect(0,0,250,768);
    InvalidateRect(&rect);
    //使限定区域重绘
    但是在Button的响应函数如何调用呢?
      

  8.   

    看了一下你上面的程序按照我的理解,你是想让点击一个按钮,就只让这个按钮所代表的定时器工作,而其他两个按钮所代表的定时器不工作,如果是这个意思的话,你就不能在OnCreate中直接设置3个定时器,因为定时器是从它被设置的那一时刻就开始工作的如果我的理解正确的话,你应该在按钮点击函数中先删除另外两个定时器然后再设置这个按钮所代表的定时器,
    比如,你可以在OnBtnP1()中这样设置:
    KillTimer(2);
    KillTimer(3);
    SetTimer(1,1000,NULL);
      

  9.   


    不,我的意思是1号按钮是使用一号定时器,2号是不使用定时器,3号是点击一下用2号定时器,再点击是使用3号定时器,再点击不使用定时器。
    我回去试试看你说的在Button的响应函数里添加设置。
      

  10.   

    那也简单,在OnBtnP1()中
    KillTimer(2);
    KillTimer(3);
    SetTimer(1,1000,NULL);OnBtnP2()中;
    KillTimer(1);
    KillTimer(2);
    KillTimer(3);OnBtnP3()中;
    先设置成员变量int m_timer;初始化为1
    KillTimer(1);
    KillTimer(2);
    KillTimer(3);
    if(m_timer==1)
    {
    m_timer=2;
    }
    else if(m_timer==2)
    {
    m_timer=3;
    }
    else
    {
    m_timer=1;
    }
    switch(m_timer)
    {
    case 1:
    break;
    case 2:
    SetTimer(m_timer,500,NULL);
    break;
    case 3:
    SetTimer(m_timer,100,NULL);
    break;
    }
      

  11.   

    不太可能实现按个按钮调用一个定时起
    你也一直没说你设置了三个定时器
    我是说你可以设置一个定时器
    然后再OnTimer里分拍
    用你现在的方法就可以了
    通过不同的ID(当然是自己控制的)来区分
      

  12.   


    if(nIDEvent== 1)
        {
            n++;
            CRect rect(0,0,250,768);
            InvalidateRect(&rect);
            
        }
         if(nIDEvent == 2)
        {
    //        KillTimer(1);
            n++;
            CRect rect(0,0,250,768);
            InvalidateRect(&rect);
            
        }
         if( nIDEvent== 3)
        {
            
    //        KillTimer(1);
    //        KillTimer(2);
            n++;
            CRect rect(0,0,250,768);
            InvalidateRect(&rect);
            
        }是通过OnTimer()里面的一个参数nIDEvent来判断的
      

  13.   

    你在WM_CREATE消息的响应函数中调用SetTimer三个定时器,这个时候你的OnTimer已经在运行了
      

  14.   


    对啊。忘记了。那如果我在Button的响应函数里面设置的话,是点击响应才开始的吗?
      

  15.   

    我想问下就是如果说在WM_CREATE消息的响应函数中,设置了3个定时器,在Button的单击函数中用
    KillTimer函数的话,可以吗?
      

  16.   

    晕倒了ontimer里只要写不同事件的区分就行在button里写settimer在button里不需要写到ontimer和其他的
      

  17.   

    KillTimer可以在任何地方使用 包括OnTimer里
      

  18.   

    我按照你的方法改了下代码。如下
    //添加的按钮单击响应函数
    void CPUMPView::OnBtnP1()
    {
    MessageBox("开启泥泵" );
    m_isclick = TRUE;
    IDNum = 1;
    //添加定时器1号
    SetTimer(IDNum,1000,NULL);
    }void CPUMPView::OnBtnP2()
    {
    MessageBox("关闭泥泵" );
    m_isclick = FALSE;
    IDNum = 1;
    }void CPUMPView::OnBtnP3()
    {
    MessageBox("增加泥泵转速" );
    if(m_isclick = TRUE&&IDNum<=3)
    {
    IDNum++;
    }
    else
    {
    m_isclick = FALSE;
    IDNum=1;
    }
    switch(IDNum)
    {
    case 1:
    SetTimer(IDNum,1000,NULL);
    break;
    case 2:
    SetTimer(IDNum,500,NULL);
    break;
    case 3:
    SetTimer(IDNum,100,NULL);
    break;
    }
    }发现了一个问题,为什么我单击按钮1,按钮3,循环后再单击按钮1,调用了定时器3呢?
      

  19.   

    OK了。
    void CPUMPView::OnBtnP1()
    {
    MessageBox("开启泥泵" );
    m_isclick = TRUE;
    IDNum = 1;
    //添加定时器1号
    SetTimer(IDNum,1000,NULL);
    //KillTimer(2);
    //KillTimer(3);
    }忘记了。呵呵