Fourniture de l'interaction souris pendant qu'inactif
Si votre contrôle n'est pas immédiatement activé, il est possible que vous vouliez qu'il traite des messages WM_SETCURSOR et WM_MOUSEMOVE, même si le contrôle n'a pas de fenêtre propre. Cela peut être accompli en activant l'implémentation COleControl de l'interface IPointerInactive, qui est désactivée par défaut. (Voir ActiveX Kit de développement logiciel (SDK) pour une description de cette interface.) Pour l'activer, incluez la balisepointerInactive dans l'ensemble de balises retournées par COleControl::GetControlFlags:
DWORD CMyAxOptCtrl::GetControlFlags()
{
DWORD dwFlags = COleControl::GetControlFlags();
...
// The control can receive mouse notifications when inactive.
dwFlags |= pointerInactive;
...
return dwFlags;
}
Le code pour inclure cette balise est automatiquement généré si vous sélectionnez l'option Notifications du pointeur de la souris pendant l'inactivité dans la page Paramètres du contrôle quand vous creéz votre contrôle avec Assistant Contrôle ActiveX MFC.
Lorsque l'interface IPointerInactive est activée, le conteneur lui délègue les messages WM_SETCURSOR et WM_MOUSEMOVE. L'implémentation de COleControl de IPointerInactive répartit les messages via la table des messages de votre contrôle, après avoir ajusté les coordonnées de la souris correctement. Vous pouvez traiter les messages comme des messages ordinaires de fenêtre, en ajoutant des entrées correspondantes dans la table des messages. Dans les gestionnaires de ces messages, évitez d'utiliser la variable membre m_hWnd (ou une fonction membre qui utilise) sans vérifier d'abord que la valeur n'est pas NULL.
Il est possible que vous vouliez aussi qu'un contrôle inactif à être la cible d'une opération de glisser-déplacer OLE. Cela nécessite l'activation du contrôle au moment où l'utilisateur fait glisser un objet dessus, de sorte que la fenêtre de contrôle peut être inscrite en tant que cible de suppression. Pour déclencher l'activation pendant un glisser-déplacer, substituez COleControl::GetActivationPolicy, et retournez la balise POINTERINACTIVE_ACTIVATEONDRAG :
DWORD CMyAxOptCtrl::GetActivationPolicy()
{
return POINTERINACTIVE_ACTIVATEONDRAG;
}
Activer l'interface IPointerInactive signifie généralement que le contrôle soit capable de traiter les messages de la souris à tout moment. Pour obtenir ce résultat dans un conteneur qui ne prend pas en charge l'interface IPointerInactive, votre contrôle doit être toujours activé quand il est visible, ce qui signifie que le contrôle doit inclure la balise OLEMISC_ACTIVATEWHENVISIBLE parmi ses diverses balises. Toutefois, pour éviter que cette balise prenne effet dans un conteneur qui prend en charge IPointerInactive, vous pouvez également spécifier la balise OLEMISC_IGNOREACTIVATEWHENVISIBLE :
static const DWORD BASED_CODE _dwMyOleMisc =
OLEMISC_ACTIVATEWHENVISIBLE |
OLEMISC_IGNOREACTIVATEWHENVISIBLE |
OLEMISC_SETCLIENTSITEFIRST |
OLEMISC_INSIDEOUT |
OLEMISC_CANTLINKINSIDE |
OLEMISC_RECOMPOSEONRESIZE;