Использование функции Windows SetTimer () - PullRequest
5 голосов
/ 06 мая 2009

Я путаюсь с функцией SetTimer ().

SetTimer () принимает три параметра:

SetTimer(1,2000,Timerflow);

Однако я видел другую версию SetTimer, которая принимает четыре параметра:

SetTimer(NULL,1,2000,Timerflow);

В чем разница между этими двумя функциями?

Я знаю SetTimer () Три параметра. Но когда я пытаюсь использовать функцию SetTimer () с четырьмя параметрами, я получаю сообщение об ошибке:

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

Так в чем же основное отличие и в чем причина этой ошибки?

Ответы [ 4 ]

5 голосов
/ 06 мая 2009

4-параметрическая версия - это простая версия Win32 API, а первый параметр - дескриптор окна.

Трехпараметрическая версия является членом класса CWnd MFC и работает с дескриптором окна экземпляра CWnd, для которого вы ее вызываете.

Если вам нужно вызвать 4-параметрический Win32 API из метода объекта, производного от CWnd, сделайте следующее:

::SetTimer(NULL, 1, 2000, Timerflow);
2 голосов
/ 06 мая 2009

Единственный Windows API под названием SetTimer принимает четыре параметра. Предположительно, другой является частью MFC или некоторой другой структуры, и первый параметр подразумевается объектом, к которому вы обращаетесь. Например:

CWnd * w = .... // get window somehow
w->SetTimer(1,2000,Timerflow);
1 голос
/ 02 марта 2011

Если вы используете SetTimer для создания таймера в классах GUI, таких как CWnd MFC, вы можете использовать форму с тремя параметрами:

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 
);

Это очень просто, не правда ли?

0 голосов
/ 17 февраля 2016

Согласно MSDN: https://msdn.microsoft.com/en-us/library/windows/desktop/ms644906(v=vs.85).aspx, первый и последний параметры являются необязательными. Следовательно, вы можете вызывать SetTimer даже с двумя параметрами (однако не рекомендуется). Ошибка, скорее всего, из-за неправильного приведения (нужен uint_ptr, например, hwnd)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...