Partage via


Prise en charge de l'interaction souris pendant l'inactivité

Si votre contrôle n’est pas activé immédiatement, vous pouvez toujours le traiter WM_SETCURSOR et WM_MOUSEMOVE messages, même si le contrôle n’a pas de fenêtre propre. Pour ce faire, activez COleControll’implémentation de l’interface IPointerInactive , qui est désactivée par défaut. (Voir le Kit de développement logiciel (SDK) ActiveX pour 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 sur la page Contrôle Paramètres lors de la création de votre contrôle avec l’Assistant Contrôle ActiveX MFC.

Lorsque l’interface est activée, le IPointerInactive conteneur délègue WM_SETCURSOR et WM_MOUSEMOVE messages à celui-ci. COleControll’implémentation de l’implémentation des messages par le biais de la carte des messages de votre contrôle après avoir ajusté les coordonnées de IPointerInactive 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 pour ces messages, évitez d’utiliser la variable membre m_hWnd (ou toute fonction membre qui l’utilise) sans case activée 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 l’activation du contrôle au moment où l’utilisateur fait glisser un objet dessus, afin que la fenêtre du contrôle puisse être inscrite en tant que cible de déplacement. Pour provoquer l’activation pendant un glisser-déplacer, remplacez COleControl ::GetActivationPolicy et retournez 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