我使用计时器来绘制动画,但是我希望动画的速度根据用户输入而改变。
在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()
重新计算超时。不幸的是,这不会发生。
我想念什么?
答案 0 :(得分:4)
我认为您误解了文档。
要更改现有计时器,您必须传递与最初调用hWnd
时相同的nIDEvent
,lpTimerFunc
和SetTimer
参数组合。
来自reference:
如果hWnd参数不为NULL且hWnd指定的窗口 已经有一个值为nIDEvent的计时器,那么现有的计时器 替换为新计时器。
也:
计时器标识符nIDEvent特定于关联的窗口。 另一个窗口可以有自己的计时器,该计时器与 另一个窗口拥有的计时器。计时器各不相同。
仅靠最后一个引号就足以证明您总是必须指定hWnd
参数来修改与窗口关联的现有计时器。否则,系统应如何知道您要更改哪个计时器?您可以有两个窗口,每个窗口的计时器ID为1,这是两个不同的计时器!