Существует еще одно решение, но для использования этого параметра - HWND
в SetTimer
должно быть non-NULL
.
Можно сохранить дополнительные данные в самом окне, используя функцию APISetWindowLongPtr
с параметром GWLP_USERDATA
.
Таким образом, вы можете добавить в свой класс следующую функцию:
void SetLocalTimer(UINT_PTR nIDEvent, UINT nElapse)
{
SetWindowLongPtr(m_hWnd, GWLP_USERDATA, (LONG_PTR)this);
SetTimer(nIDEvent, nElapse, _TimerRouter);
}
и функцию таймера-роутера, которая определяет, что делать с данным таймером.
static void CALLBACK _TimerRouter(HWND hwnd, UINT, UINT_PTR nEventID, DWORD)
{
YourClassName* inst = (YourClassName*)GetWindowLong(hwnd, GWLP_USERDATA);
if( !inst )
return;
switch (nEventID)
{
case 0:
inst->DoThis();
break;
case 1:
inst->DoThat();
break;
}
}
Это также позволяет использовать nEventID в качестве идентификатора вызываемой функции.
Существует риск того, что пользовательские данные будут использоваться из более чем одного места, но я думаю, что это хорошая практикасохраняйте окно интерфейса в соответствии с моделью класса этого указателя.