Partager via


Fournir une interaction avec la souris en cas d’inactivité

Si votre contrôle n’est pas activé immédiatement, vous souhaiterez peut-être toujours qu'il traite les messages WM_SETCURSOR et WM_MOUSEMOVE, même si le contrôle n’a pas sa propre fenêtre. Pour ce faire, activez l’implémentation de l’interface COleControl par IPointerInactive, qui est désactivée par défaut. (Consultez le Kit de développement logiciel (SDK) ActiveX pour obtenir une description de cette interface.) Pour l’activer, incluez l’indicateur pointerInactive dans l’ensemble d’indicateurs retournés par COleControl ::GetControlFlags :

DWORD CMyAxOptCtrl::GetControlFlags()
{
   DWORD dwFlags = COleControl::GetControlFlags();
// The control can receive mouse notifications when inactive.
dwFlags |= pointerInactive;
return dwFlags;
}

Le code à inclure cet indicateur est généré automatiquement si vous sélectionnez l’option Notifications du pointeur de la souris lorsque vous êtes inactif dans la page Paramètres du contrôle lors de la création de votre contrôle avec l’Assistant Contrôle ActiveX MFC.

Lorsque l'IPointerInactive interface est activée, le conteneur délègue les messages WM_SETCURSOR et WM_MOUSEMOVE à celle-ci. L'implémentation de COleControl par IPointerInactive envoie les messages via la table de messages de votre contrôle après avoir ajusté les coordonnées de la souris de manière appropriée. Vous pouvez traiter les messages comme les messages de fenêtre ordinaires en ajoutant les entrées correspondantes à la carte des messages. Dans vos gestionnaires de ces messages, évitez d’utiliser la variable membre m_hWnd (ou toute fonction membre qui l’utilise) sans vérifier d’abord que sa valeur n’est pas NULL.

Vous pouvez également souhaiter qu’un contrôle inactif soit la cible d’une opération de glisser-déplacer OLE. Cela nécessite d'activer le contrôle au moment où l'utilisateur y fait glisser un objet, afin que la fenêtre du contrôle puisse être enregistrée comme cible de dépôt. Pour déclencher l'activation pendant un glissement, remplacez COleControl::GetActivationPolicy et renvoyez l'indicateur POINTERINACTIVE_ACTIVATEONDRAG :

DWORD CMyAxOptCtrl::GetActivationPolicy()
{
   return POINTERINACTIVE_ACTIVATEONDRAG;
}

L’activation de l’interface IPointerInactive signifie généralement que vous souhaitez que le contrôle soit capable de traiter les messages de souris à tout moment. Pour obtenir ce comportement dans un conteneur qui ne prend pas en charge l’interface IPointerInactive , vous devez toujours activer votre contrôle lorsqu’il est visible, ce qui signifie que le contrôle doit inclure l’indicateur OLEMISC_ACTIVATEWHENVISIBLE parmi ses différents indicateurs. Toutefois, pour empêcher que cet indicateur prenne effet dans un conteneur prenant en charge IPointerInactive, vous pouvez également spécifier l’indicateur OLEMISC_IGNOREACTIVATEWHENVISIBLE :

static const DWORD BASED_CODE _dwMyOleMisc =
OLEMISC_ACTIVATEWHENVISIBLE |
OLEMISC_IGNOREACTIVATEWHENVISIBLE |
OLEMISC_SETCLIENTSITEFIRST |
OLEMISC_INSIDEOUT |
OLEMISC_CANTLINKINSIDE |
OLEMISC_RECOMPOSEONRESIZE;

Voir aussi

Contrôles ActiveX MFC : Optimisation