Proporcionar la interacción del mouse mientras está inactivo
Si el control inmediatamente no se activa, puede aún desee procesar WM_SETCURSOR y los mensajes de WM_MOUSEMOVE , aunque el control no tiene ninguna ventana propios.Esto se puede lograr que permite la implementación de los entity_CODECOleControl de la interfaz de IPointerInactive , que está deshabilitada de forma predeterminada.(Vea ActiveX SDK para obtener una descripción de esta interfaz.) Para habilitarla, incluya la marca de pointerInactive en el conjunto de indicadores devueltos por COleControl::GetControlFlags:
DWORD CMyAxOptCtrl::GetControlFlags()
{
DWORD dwFlags = COleControl::GetControlFlags();
...
// The control can receive mouse notifications when inactive.
dwFlags |= pointerInactive;
...
return dwFlags;
}
El código para incluir este marcador se genera automáticamente si selecciona la opción de Mouse Pointer Notifications When Inactive en la página de Los valores de Control al crear el control con MFC ActiveX Control Wizard.
Cuando se habilita la interfaz de IPointerInactive , el contenedor delega WM_SETCURSOR y los mensajes de WM_MOUSEMOVE al.La implementación de los entity_CODECOleControl de IPointerInactive envía los mensajes a través del mensaje del control asignado después de ajustar las coordenadas del mouse correctamente.Puede procesar los mensajes como mensajes normales de la ventana agregando las entradas correspondientes al mapa de mensajes.En los controladores para estos mensajes, evite utilizar la variable miembro de m_hWnd (o cualquier función miembro que lo utilice) sin comprobar primero que su valor no es NULL.
Puede que también desee un control inactivo para ser el destino de una operación de arrastrar y colocar de OLE.Esto requiere generar el control en el momento en que el usuario arrastra un objeto encima, para poder registrar la ventana de control como destino.Para hacer la activación para producir durante una operación de arrastrar, reemplace COleControl::GetActivationPolicy, y devuelve el mensaje de POINTERINACTIVE_ACTIVATEONDRAG :
DWORD CMyAxOptCtrl::GetActivationPolicy()
{
return POINTERINACTIVE_ACTIVATEONDRAG;
}
Habilitar la interfaz de IPointerInactive significa normalmente que desea que el control sea capaz de mensajes del mouse de procesamiento siempre.Para obtener este comportamiento en un contenedor que no admite la interfaz de IPointerInactive , debe tener el control se genera cuando está visible, que significa que el control debe incluir la marca de OLEMISC_ACTIVATEWHENVISIBLE entre los marcadores diferentes.Sin embargo, para evitar que este marcador surta efecto en un contenedor que admite IPointerInactive, también puede especificar la marca de OLEMISC_IGNOREACTIVATEWHENVISIBLE :
static const DWORD BASED_CODE _dwMyOleMisc =
OLEMISC_ACTIVATEWHENVISIBLE |
OLEMISC_IGNOREACTIVATEWHENVISIBLE |
OLEMISC_SETCLIENTSITEFIRST |
OLEMISC_INSIDEOUT |
OLEMISC_CANTLINKINSIDE |
OLEMISC_RECOMPOSEONRESIZE;