定时器超时重置

时间:2018-09-03 18:03:39

标签: c++ winapi timer

我使用计时器来绘制动画,但是我希望动画的速度根据用户输入而改变。

API's documentation上,我读到:

  

与计时器关联的窗口的句柄。该窗口必须归调用线程所有。 如果将hWnd的NULL值与现有计时器的nIDEvent一起传递,则该计时器将以与现有非NULL hWnd计时器相同的方式替换。

我知道应该在不使用SetTimer()参数的情况下调用hWnd函数来重置计时器,所以我做到了:

//功能声明

void InitiateTimer(HWND hWnd)
{
    SetTimer(hWnd,                          // handle to main window 
        IDT_TIMER,                          // timer identifier 
        1000 / Robot_Settings::getSpeed(),  // 1-second interval / speed 
        (TIMERPROC)NULL);                   // no timer callback 

    timerInitiated = true;
}

void ResetTimer()
{
    SetTimer(NULL,
        IDT_TIMER, 
        1000 / Robot_Settings::getSpeed(), 
        (TIMERPROC)NULL);
}

// WindowProc中的函数调用

    case BUTTON_START:
        stopClicked = false;
        DestroyWindow(hStartButton);
        CreateStopButton(hWnd);
        if (!timerInitiated)
        {
            InitiateTimer(hWnd);
        }
        else if (timerInitiated)
        {
            ResetTimer();
        }
        return 0;

想法是在重置时,将根据Robot_Settings::getSpeed()重新计算超时。不幸的是,这不会发生。

我想念什么?

1 个答案:

答案 0 :(得分:4)

我认为您误解了文档。

要更改现有计时器,您必须传递与最初调用hWnd时相同的nIDEventlpTimerFuncSetTimer参数组合。

来自reference

  

如果hWnd参数不为NULL且hWnd指定的窗口   已经有一个值为nIDEvent的计时器,那么现有的计时器   替换为新计时器。

也:

  

计时器标识符nIDEvent特定于关联的窗口。   另一个窗口可以有自己的计时器,该计时器与   另一个窗口拥有的计时器。计时器各不相同。

仅靠最后一个引号就足以证明您总是必须指定hWnd参数来修改与窗口关联的现有计时器。否则,系统应如何知道您要更改哪个计时器?您可以有两个窗口,每个窗口的计时器ID为1,这是两个不同的计时器!