2017-02-01 3 views
0

J'utilise CWnd :: SetTimer (MFC ActiveX COM) mais l'assertion vient qu'il n'y a pas hwnd. Puis-je définir hwnd à partir de Jacob? Ceci est le code d'assertion.Puis-je définir hwnd de Jacob?

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

Répondre

1

Des mots immortels du film Mr. Mom, "Vous le faites mal."

Non, vous ne pouvez pas définir hwnd à partir de Jacob. Je serais intéressant comment vous appelez CWnd :: SetTimer(). Il doit toujours provenir d'une fenêtre créée et associée à un m_hWnd. Donc, en supposant que vous avez une fenêtre valide, vous appelez:

// assume pWnd is a CWnd* or derived object that has been created. 
pWnd->SetTimer(nIDEvent, nElapse, NULL); 

Le CWnd (ou dérivé) doit avoir déjà été créé. Donc, vous avez quelques options ...

Supposons que vous avez déjà un hwnd HWND ....

Vous devriez avoir une certaine classe et de cette classe que vous appelez SubclassWindow ...

CSomeWindow someWindow; // declaring these on stack probably bad idea 
someWindow.SubclassWindow(hwnd); 
someWindow.SetTimer(nIDEvent, nElapse, NULL); 

l'autre option est que vous créez la fenêtre ...

CSomeWindow someWindow; // declaring these on stack probably bad idea 
someWindow.Create(.... create params); 
someWindow.SetTimer(nIDEvent, nElapse, NULL); 

ou

CSomeWindow* pSomeWindow = new CSomeWindow(); 
pSomeWindow->Create(.... create params); 
pSomeWindow->SetTimer(nIDEvent, nElapse, NULL); 

Dans l'exemple ci-dessus, aucune fonction n'est fournie - juste NULL. Dans ce cas, il dirigera vers votre gestionnaire ON_WM_TIMER().

OTOH, peut-être avez-vous une fenêtre (votre contrôle OCX?), Pour laquelle vous voulez régler le minuteur. Eh bien, vous voulez juste vous assurer que vous l'appelez après que la fenêtre (HWND) a été créée. Quelque temps après sa méthode OnCreate() a été créée. Cela pourrait être votre problème, mais vous avez peu d'informations et je ne fais que poignarder dans le noir.

pYourOcx->SetTimer(nIDEvent, nElapse, NULL); 

Cependant, techniquement, vous n'avez même pas besoin d'une fenêtre. Vous pouvez appeler la version Windows API de SetTimer() ...

::SetTimer(NULL, nIDEvent, nElapse, MyTimerFunc); // MyTimerFunc is your user defined timer function 
+0

Merci, je l'ai résolu. J'ai dû corriger l'ocx existant et accrocher SetTimer pour créer un HWND factice pour le traiter parce qu'il y avait un Ontimer très ramifié. –