Fourniture de l'interaction souris pendant qu'inactif
Si votre contrôle n'est pas immédiatement activé, vous pouvez encore le souhaiter pour traiter WM_SETCURSOR et des messages d' WM_MOUSEMOVE , même si le contrôle n'a pas de fenêtre de ses propres.Cette opération peut être effectuée en activant l'implémentation des COleControl de l'interface d' IPointerInactive , qui est désactivée par défaut.(Consultez ActiveX Kit de développement logiciel pour obtenir une description de cette interface.) Pour l'activer, incluez l'indicateur d' pointerInactive dans le jeu 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 généré automatiquement si vous sélectionnez l'option de Mouse Pointer Notifications When Inactive dans la page de paramètres de contrôle en créant votre contrôle avec MFC ActiveX Control Wizard.
Lorsque l'interface d' IPointerInactive est activée, le conteneur délègue WM_SETCURSOR et des messages d' WM_MOUSEMOVE lui.l'implémentation des COleControl d' IPointerInactive distribue les messages par le biais de 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 les messages ordinaires de fenêtre en ajoutant des entrées correspondantes dans la table des messages.Dans vos gestionnaires pour ces messages, évitez d'utiliser la variable membre d' m_hWnd (ou une fonction membre qui l'utilise) sans vous permettre d'abord que sa valeur n'est pas NULL.
Vous pouvez également souhaiter qu'un contrôle inactif pour être la cible d'une opération de glisser-déplacer OLE.Il faut activer le contrôle au moment où l'utilisateur fait glisser un objet dessus, afin que la fenêtre du contrôle puisse être enregistrée en tant que cible de déplacement.Pour provoquer pendant une opération de glissement, une substitution COleControl::GetActivationPolicy, et retourner l'activation la balise de POINTERINACTIVE_ACTIVATEONDRAG :
DWORD CMyAxOptCtrl::GetActivationPolicy()
{
return POINTERINACTIVE_ACTIVATEONDRAG;
}
Activer l'interface d' IPointerInactive signifie généralement que vous souhaitez que le contrôle soit capable de traiter les messages de la souris à tout moment.Pour obtenir ce comportement dans un conteneur qui ne prend pas en charge l'interface d' IPointerInactive , vous devez disposer votre contrôle toujours activé si visible, ce qui signifie que le contrôle doit inclure la balise d' OLEMISC_ACTIVATEWHENVISIBLE parmi ses diverses balises.Toutefois, pour empêcher cette balise de prendre l'effet dans un conteneur qui prend en charge IPointerInactive, vous pouvez également spécifier la balise d' OLEMISC_IGNOREACTIVATEWHENVISIBLE :
static const DWORD BASED_CODE _dwMyOleMisc =
OLEMISC_ACTIVATEWHENVISIBLE |
OLEMISC_IGNOREACTIVATEWHENVISIBLE |
OLEMISC_SETCLIENTSITEFIRST |
OLEMISC_INSIDEOUT |
OLEMISC_CANTLINKINSIDE |
OLEMISC_RECOMPOSEONRESIZE;