c++ - 定时器超时复位
问题描述
我使用计时器来绘制动画,但我希望动画的速度在用户输入时改变。
在API 的文档中,我读到:
要与计时器关联的窗口句柄。此窗口必须由调用线程拥有。如果 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()
. 不幸的是,这不会发生。
我错过了什么?
解决方案
我认为您误解了文档。
要更改现有计时器,您必须传递与最初调用时相同的hWnd
,nIDEvent
和参数组合。lpTimerFunc
SetTimer
从参考:
如果 hWnd 参数不为 NULL 并且由 hWnd 指定的窗口已经有一个值为 nIDEvent 的计时器,那么现有的计时器将被新的计时器替换。
还:
计时器标识符 nIDEvent 特定于相关联的窗口。另一个窗口可以有自己的计时器,该计时器与另一个窗口拥有的计时器具有相同的标识符。计时器是不同的。
仅最后一个引用就足以证明您始终必须指定hWnd
参数来修改与窗口关联的现有计时器。否则,系统怎么知道,你想改变哪个定时器?您可以有两个窗口,每个窗口的计时器 ID 为 1,它们是两个不同的计时器!
推荐阅读
- php - Laravel 查询生成器 Eloquent
- ipfs - 如何从 IPFS 检索丢失的文件?
- swift - SwiftUI:使用 NavigationView 导致图像和文本消失
- javascript - 在 oidc-react 中测试组件
- firebase - Firebase auth - 如何取消保护 REST API 中的 listCollectionIds 方法
- .net-core - 如何使用 Azure Devops Pipeline 上的 dotnet CLI 更新 .NET Core 解决方案?
- css - 如何停止 flex 自动调整,目前基于文本长度自动调整。尽管有任何文本长度,我都希望整个表格大小相同
- html - 为什么我的背景图像在移动设备上滚动调整大小?
- python - 如何生成唯一(!)均匀分布的随机数组/列表/序列
- c# - 类似于 RunWorkerCompleted 的 await/async 回调主线程