Proporcionar interacción con el mouse mientras está inactivo

Si el control no se activada inmediatamente, es posible que quiera procesar los mensajes WM_SETCURSOR y WM_MOUSEMOVE, aunque el control no tenga ventana propia. Esto se puede lograr al habilitar la implementación de COleControl de la interfaz IPointerInactive, que está deshabilitada de forma predeterminada. (Consulte ActiveX SDK para obtener una descripción de esta interfaz). Para habilitarlo, incluya la marca pointerInactive en el conjunto de marcas devueltas 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 esta marca se genera automáticamente si se selecciona la opción Notificaciones del puntero del mouse cuando está inactivo en la página Configuración de control al crear el control con el Asistente para controles ActiveX de MFC.

Cuando la interfaz IPointerInactive está habilitada, el contenedor delega en él los mensajes WM_SETCURSOR y WM_MOUSEMOVE. La implementación de COleControl de IPointerInactive envía los mensajes a través del mapa de mensajes del control después de ajustar las coordenadas del mouse correctamente. Puede procesar los mensajes igual que los mensajes normales de la ventana, al agregar las entradas correspondientes al mapa de mensajes. En los controladores de estos mensajes, evite usar la variable miembro m_hWnd (o cualquier función miembro que la use) sin primero comprobar que su valor no es NULL.

También puede querer que un control inactivo sea el destino de una operación OLE de arrastrar y colocar. Esto requiere la activación del control en el momento en que el usuario arrastra un objeto sobre él, de modo que la ventana del control pueda registrarse como destino de colocación. Para que la activación se efectúe durante una operación de arrastre, invalide COleControl::GetActivationPolicy y devuelva la marca POINTERINACTIVE_ACTIVATEONDRAG:

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

La activación de la interfaz IPointerInactive usualmente significa que se desea que el control sea capaz de procesar los mensajes del mouse en todo momento. Para obtener este comportamiento en un contenedor que no admite la interfaz IPointerInactive, es necesario que el control esté siempre activado cuando sea visible, lo que significa que el control debe incluir la marca OLEMISC_ACTIVATEWHENVISIBLE entre sus diversas marcas. Sin embargo, para evitar que esta marca tenga efecto en un contenedor que admita IPointerInactive, también se puede especificar la marca OLEMISC_IGNOREACTIVATEWHENVISIBLE:

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

Consulte también

Controles ActiveX MFC: Optimización