我正在使用添加了资源 ID 并基于 WM_TIMER 消息的计时器。我想调用一个例程,例如DrunkenDragon()
on,OnTimer()
但只SetTimer(id,10sec,NULL)
调用一次。我们知道调用KillTimer()
内部DrunkenDragon()
例程可以解决问题。可以这样做吗,还是我错过了一些很棒的计时器。
问问题
2022 次
3 回答
0
int CYourDialog::OnInitDialog()
{
__super::OnInitDialog();
SetTimer(0x10, 10000, NULL);
return true;
}
void CYourDialog::OnTimer(UINT_PTR ignore)
{
DrunkenDragon();
}
并确保您有ON_WM_TIMER
消息映射。
于 2012-07-14T04:54:55.133 回答
0
您没有遗漏任何东西,您必须使用 KillTimer 让系统停止生成 WM_TIMER 消息。
您还可以使用 CreateTimerQueueTimer 并以仅调用一次回调的方式设置参数。
于 2012-07-15T12:50:57.030 回答
0
(只有在其他人像我一样遇到它并且对可用的答案不满意时才回答这个问题)
因此,在 WindowClass.h 中,您可以做的是枚举您想要使用的计时器标识符。虽然您当然可以使用原始数值,但从长远来看,使用符号可能更容易使用。
class WindowClass : CWnd
{
// other parts of the interface...
protected:
enum
{
TIMER_MAIN_UPDATE = 1,
TIMER_PLASTERED_DRAGON
};
};
同时,回到 WindowClass.cpp,
int WindowClass::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
// { ... other initialization code }
// In case you want to do other types of updates at regular intervals.
SetTimer(TIMER_MAIN_UPDATE, 1000, NULL);
// Note the symbolic identifiers.
SetTimer(TIMER_PLASTERED_DRAGON, 10000, NULL);
return 0;
}
但是,如果您想在创建窗口 10 秒后执行此操作,那只会有好处。您也可以随时在其他事件处理程序中调用 SetTimer():
void WindowClass::OnJustGotPaid()
{
// { ... other handling }
// Since our dragon is a real lightweight, it apparently only takes
// 10 seconds to get him puking up flaming vomit.
SetTimer(TIMER_PLASTERED_DRAGON, 10000, NULL);
}
当需要处理实际事件时,通常在 Windows OnTimer() 回调中处理。如果需要,可以通过在 SetTimer() 的第三个参数中指定有效的函数指针而不是 NULL,将计时器事件定向到不同的(自定义)回调。
void WindowClass::OnTimer(UINT_PTR p_timer_id)
{
switch(p_timer_id)
{
default:
break;
case TIMER_MAIN_UPDATE:
// { ... main update code }
break;
case TIMER_PLASTERED_DRAGON:
// Killing the timer first in case DrunkenDragon() takes a good
// long while for whatever reason.
KillTimer(TIMER_PLASTERED_DRAGON);
DrunkenDragon();
break;
}
}
于 2013-04-17T18:42:44.053 回答