我对SetTimer()函数感到困惑。
SetTimer()有三个参数:
SetTimer(1,2000,Timerflow);
但是我看到另一个版本的SetTimer需要四个参数:
SetTimer(NULL,1,2000,Timerflow);
这两个功能有什么区别?
我知道SetTimer()三个参数。但是当我尝试四个参数SetTimer()函数时,我得到错误:
error C2660: 'SetTimer' : function does not take 4 parameters
那么主要区别是什么以及导致此错误的原因是什么?
答案 0 :(得分:5)
4参数版本是普通的Win32 API版本,第一个参数是窗口句柄。
3参数版本是MFC的CWnd类的成员,并且与您调用它的CWnd实例的窗口句柄一起使用。
如果需要在CWnd派生对象的方法中调用4参数Win32 API,请执行以下操作:
::SetTimer(NULL, 1, 2000, Timerflow);
答案 1 :(得分:2)
唯一名为SetTimer的Windows API需要四个参数。据推测,另一个是MFC或其他框架的一部分,第一个参数由您调用它的对象隐含。例如:
CWnd * w = .... // get window somehow
w->SetTimer(1,2000,Timerflow);
答案 2 :(得分:1)
如果使用SetTimer在GUI类(如MFC的CWnd)中创建计时器,则可以使用3参数形式:
UINT SetTimer(
UINT nIDEvent, // timer identifier
UINT uElapse, // time-out value
TIMERPROC lpTimerFunc // address of timer procedure
);
但是如果在非GUI类中使用它,则必须使用4参数形式。第一个参数是指定哪个GUI组件将响应计时器事件。从Win32 API调用此版本的函数。
eUINT SetTimer(
HWND hWnd, // handle of window for timer messages
UINT nIDEvent, // timer identifier
UINT uElapse, // time-out value
TIMERPROC lpTimerFunc // address of timer procedure
);
这很简单,不是吗?
答案 3 :(得分:0)
根据MSDN:https://msdn.microsoft.com/en-us/library/windows/desktop/ms644906(v=vs.85).aspx,第一个和最后一个参数是可选的。因此,您可以使用偶数2个参数进行SetTimer调用(但不推荐)。错误很可能来自错误的演员表(例如,需要一个uint_ptr,你给一个hwnd)