Winapi 使用Windows SetTimer()函数

Winapi 使用Windows SetTimer()函数,winapi,visual-c++,Winapi,Visual C++,我对SetTimer()函数感到困惑 SetTimer()接受三个参数: SetTimer(1,2000,Timerflow); SetTimer(NULL,1,2000,Timerflow); 但是,我看到了另一个版本的SetTimer,它有四个参数: SetTimer(1,2000,Timerflow); SetTimer(NULL,1,2000,Timerflow); 这两种功能之间有什么区别 我知道SetTimer()有三个参数。但是,当我尝试使用四参数SetTimer()函数时

我对SetTimer()函数感到困惑

SetTimer()接受三个参数:

SetTimer(1,2000,Timerflow);
SetTimer(NULL,1,2000,Timerflow);
但是,我看到了另一个版本的SetTimer,它有四个参数:

SetTimer(1,2000,Timerflow);
SetTimer(NULL,1,2000,Timerflow);
这两种功能之间有什么区别

我知道SetTimer()有三个参数。但是,当我尝试使用四参数SetTimer()函数时,会出现以下错误:

error C2660: 'SetTimer' : function does not take 4 parameters

那么,主要的区别是什么?是什么导致了这个错误?

唯一一个名为SetTimer的Windows API需要四个参数。另一个可能是MFC或其他框架的一部分,第一个参数由调用它的对象暗示。例如:

CWnd * w = .... // get window somehow
w->SetTimer(1,2000,Timerflow);

4参数版本是普通的Win32 API版本,第一个参数是窗口句柄

3参数版本是MFC的CWnd类的一个成员,它与调用它的CWnd实例的窗口句柄一起工作

如果需要从CWnd派生对象的方法中调用4参数Win32 API,请执行以下操作:

::SetTimer(NULL, 1, 2000, Timerflow);

如果使用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 
);
这很简单,不是吗?

根据MSDN:,第一个和最后一个参数是可选的。因此,您甚至可以使用两个参数调用SetTimer(但不推荐)。错误很可能是由于不正确的强制转换(需要uint_ptr,例如,您提供了hwnd)