我建立一单文档程序,基类是CFormView,在view中添加了一定时器,现有两个问题:
1。希望实现一按按钮,文本编辑框里的数据就按定时器的时间更新,我在C***View::OnTimer()函数中实现程序逻辑,
{
......
val+=10*rand();
m_Edit=val;
UpdateData(FALSE);
}
按钮中
{
   SetTmer(1,100,0);
}
可是我执行程序后,还未等我按按钮,编辑框的变量已按照我随机函数的值,自动变化了,我按按钮后,就会继续按照定时器时间更新变化,请问怎么回事?如何实现我的功能,奇怪!
2。我想在view中实现多个定时器,当然timer中的程序逻辑是不一样的,可是MFC只允许添加一个ontimer()函数,提示我函数体已存在??、如何解决!!
在线等啊,解决即派分!!!!!!!!!!!!!!!!11

解决方案 »

  1.   

    onTimer()根據nIDEvent區分計時,就是SetTimer的第一個參數,你要在OnTimer中判斷
    if(nIDEvent == 1)
    {
       ...
    }
      

  2.   

    1.程序中是否只有在点击按钮的响应函数里面有SetTimer()?
    2.#define MYTIME1        WM_USER+100
      #define MYTIME2        WM_USER+101
      ....
       za
      

  3.   

    如果添加多個計時器
    SetTimer(nID1,1000,NULL);
    SetTimer(nID2,1000,NULL);
    ...
    OnTimer()
    {
      switch(nIDEvent)
      {
       case nID1:
            ...
            break;
       case nID2:
            ...
            break;
       default:
            break;
       }
    }
      

  4.   

    你有没有看到OnTimer函数有个参数????这个参数就表示定时器的编号,如果你要多个定时器。只需用SetTimer(1,100,NULL);SetTimer(2,100,NULL);等等就可以了。这里1,2分别表示定时器的编号。然后在OnTimer中判断函数的参数,如果是1,表示现在定时器1到了,如果是2,表示定时器2到了,等等
    对于第一个问题,比较奇怪。不如在OnTimer中先判断参数为1再做操作吧。
      

  5.   

    在OnTimer(UINT nIDEvent)函数里面
    switch(nIDEvent)

       case MYTIMER1:
       ...
       case MYTIMER2:
       ...
      

  6.   

    1的问题可能是你没有给m_Edit赋一个初值的问题,或者timer在View创建的时候已经启
    动了。
    2你可以在ontimer中使用case来区分各个不同的timer,当然每个timer的id和时间间隔
    要不同。
    例如:SetTimer(1, 100, 0);
    SetTimer(2, 1000, 0);OnTimer里面OnTimer(UINT nIDEvent)
    {
        Switch (nIDEvent)
        {
        case 1:
             //do something...
             break;
        case 2:
             //do ...
             break;
        }
    }
      

  7.   

    关于第一个问题
    分析一下,你是否只创建一个定时器,
    也就是说在按按钮之前,是否有别的定时器创建了
    如果没有以上的情况出现,那么你说的第一个问题就不可以出现。第二个问题的解决有可能解决你的第一个问题说明一个SetTimer的三个参数,
    第一个参数是定时器的标志号,用于区别是哪个定时器发出的信号
    第二个参数是时间间隔
    第三个参数是指定此定时器处理的函数
    如果第三个参数你设为NULL,也就是0
    那么你要在OnTimer()函数里区别定时器
    如下面的举例,我在button1中创建了两个定时器
    void CDeletezsfssssDlg::OnButton1() 
    {
    SetTimer(1000, 1000, NULL);
    SetTimer(1001, 5000, NULL);
    }
    然后在下面响应
    void CDeletezsfssssDlg::OnTimer(UINT nIDEvent) 
    {
    // TODO: Add your message handler code here and/or call default
    switch (nIDEvent)
    {
    case 1000:
    {
    static i;
    i++;
    m_i=i;
    UpdateData(FALSE);
    break;
    }
    case 1001:
    {
    MessageBox("1001");
    break;
    }
    default:
    {
    break;
    }
    }
    CDialog::OnTimer(nIDEvent);
    }