2009-05-06 4 views
4

Я смущаюсь с функцией SetTimer().Использование функции Windows SetTimer()

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

SetTimer(1,2000,Timerflow); 

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

SetTimer(NULL,1,2000,Timerflow); 

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

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

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

Так что же главное отличие и что вызывает эту ошибку?

ответ

2

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

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

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

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

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

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

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

UINT SetTimer( 
    UINT nIDEvent,    // timer identifier 
    UINT uElapse,    // time-out value 
    TIMERPROC lpTimerFunc  // address of timer procedure 
); 

Но если вы используете его в классах без графического интерфейса, вы должны использовать форму 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

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

Смежные вопросы