От бессмертных слов о фильме Мистер Мама, «Вы делаете это неправильно.»
Нет, вы не можете установить hwnd из Jacob. Мне было бы интересно, как вы вызываете CWnd :: SetTimer(). Он всегда должен быть из окна, которое было создано и связано с ним m_hWnd. Таким образом, если у вас есть действительное окно, вы бы назвали:
// assume pWnd is a CWnd* or derived object that has been created.
pWnd->SetTimer(nIDEvent, nElapse, NULL);
Событие CWnd (или производный) должен быть уже создан. Итак, у вас есть несколько вариантов ...
Скажем, у вас уже есть HWND HWND ....
Вы должны иметь некоторый класс и из этого класса вы бы назвали SubclassWindow ...
CSomeWindow someWindow; // declaring these on stack probably bad idea
someWindow.SubclassWindow(hwnd);
someWindow.SetTimer(nIDEvent, nElapse, NULL);
другой вариант заключается в том, что вы создаете окно ...
CSomeWindow someWindow; // declaring these on stack probably bad idea
someWindow.Create(.... create params);
someWindow.SetTimer(nIDEvent, nElapse, NULL);
или
CSomeWindow* pSomeWindow = new CSomeWindow();
pSomeWindow->Create(.... create params);
pSomeWindow->SetTimer(nIDEvent, nElapse, NULL);
В приведенном выше примере функция func не предоставляется - просто NULL. В этом случае он перенаправляется на ваш обработчик ON_WM_TIMER().
OTOH, может быть, у вас есть окно (ваш контроль OCX?), На который вы хотите установить таймер. Ну, вы просто хотите убедиться, что вы вызываете его после того, как было создано окно (HWND). Когда-то был создан метод OnCreate(). Это может быть вашей проблемой, но у вас мало информации, и я просто колоть в темноте.
pYourOcx->SetTimer(nIDEvent, nElapse, NULL);
Однако технически вам даже не нужно окно. Вы можете позвонить в версию Windows Set SetTimer() ...
::SetTimer(NULL, nIDEvent, nElapse, MyTimerFunc); // MyTimerFunc is your user defined timer function
Спасибо, я решил. Мне пришлось исправить существующее ocx и подключить SetTimer, чтобы создать фиктивный HWND, чтобы справиться с ним, потому что был очень разветвленный Ontimer. –