J'ai un contrôle ActiveX écrit en C++ que j'ai créé avec VS2008 et ATL. Pour la plupart, c'est un contrôle assez standard (pas très modifié du modèle d'origine), sauf qu'au lieu d'utiliser IDispatchImpl, j'ai créé ma propre implémentation IDispatchEx. Ce contrôle est uniquement utilisé dans Internet Explorer, et j'ai principalement testé avec IE8.InPlaceActivate sur le contrôle ATL non appelé jusqu'à l'événement de la souris
Tout fonctionne très bien, sauf que, pour une raison ou une autre, InPlaceActivate n'est pas appelé tant que je ne déplace pas la souris sur la zone où la balise object est hébergée dans le navigateur; aucune fenêtre n'est créée, aucun message WM_CREATE n'a été envoyé, etc.
J'ai essayé d'implémenter DISPID_READYSTATE, mais rien ne semble aider. Si j'appelle InPlaceActivate(OLEIVERB_UIACTIVATE);
de la méthode SetClientSite
et cela fonctionne habituellement, mais ce n'est certainement pas normalement nécessaire.
Pourquoi cela se produirait-il? Comment le navigateur détermine-t-il quand appeler InPlaceActivate (ou quel appel déclenche cela)?
L'étiquette utilisée pour incorporer le contrôle ATL dans la page est: <object id="plugin" type="application/x-vnd.FirebreathTemplatePlugin" width="300" height="300"></object>
Vous pleine source au fichier se trouve ici: http://code.google.com/p/firebreath/source/browse/src/ActiveXPlugin/FBControl.h
la valeur par défaut classe ATL, j'ai ce toujours là: DECLARE_OLEMISC_STATUS (OLEMISC_RECOMPOSEONRESIZE | OLEMISC_CANTLINKINSIDE | OLEMISC_INSIDEOUT | OLEMISC_ACTIVATEWHENVISIBLE | OLEMISC_SETCLIENTSITEFIRST ) Y at-il quelque chose que je pouvais faire pour remplacer, par inadvertance, que? – taxilian
Désolé, je ne suis pas sûr. C'était ma meilleure estimation. –