2017-02-01 3 views
0

Я использую CWnd :: SetTimer (MFC ActiveX COM), но утверждается, что нет hwnd. Могу ли я установить hwnd из Jacob? Это код подтверждения.Могу ли я установить hwnd из Jacob?

Afxwin2.inl линия 152.

_AFXWIN_INLINE UINT_PTR CWnd::SetTimer(UINT_PTR nIDEvent, UINT nElapse, 
     void (CALLBACK* lpfnTimer)(HWND, UINT, UINT_PTR, DWORD)) 
{ ASSERT(::IsWindow(m_hWnd)); return ::SetTimer(m_hWnd, nIDEvent, nElapse, 
    lpfnTimer); } 

ответ

1

От бессмертных слов о фильме Мистер Мама, «Вы делаете это неправильно.»

Нет, вы не можете установить 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 
+0

Спасибо, я решил. Мне пришлось исправить существующее ocx и подключить SetTimer, чтобы создать фиктивный HWND, чтобы справиться с ним, потому что был очень разветвленный Ontimer. –

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