Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
Si el control no se activa de inmediato, es posible que desee que procese los mensajes WM_SETCURSOR y WM_MOUSEMOVE, incluso si el control no tiene ventana propia. Esto se puede lograr al habilitar la implementación de COleControl de la interfaz IPointerInactive, que está deshabilitada de forma predeterminada. (Consulte el SDK de ActiveX 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 bandera se genera automáticamente si selecciona la opción Notificaciones del puntero del ratón cuando está inactivo en la página Configuración de control al crear su control con el Asistente de Control ActiveX de MFC.
Cuando la IPointerInactive interfaz está habilitada, el contenedor delega 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 de control, después de ajustar adecuadamente las coordenadas del ratón. Puede procesar los mensajes igual que los mensajes de ventana normal agregando 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 comprobar primero 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;
}
Habilitar la IPointerInactive interfaz normalmente significa que desea que el control sea capaz de procesar mensajes del mouse en todo momento. Para obtener este comportamiento en un contenedor que no admite la interfaz IPointerInactive, debe tener el control siempre activado cuando esté visible, lo que significa que el control debe incluir la bandera OLEMISC_ACTIVATEWHENVISIBLE entre sus banderas diversas. Sin embargo, para evitar que esta marca surta efecto en un contenedor que admita IPointerInactive, también puede especificar la marca OLEMISC_IGNOREACTIVATEWHENVISIBLE:
static const DWORD BASED_CODE _dwMyOleMisc =
OLEMISC_ACTIVATEWHENVISIBLE |
OLEMISC_IGNOREACTIVATEWHENVISIBLE |
OLEMISC_SETCLIENTSITEFIRST |
OLEMISC_INSIDEOUT |
OLEMISC_CANTLINKINSIDE |
OLEMISC_RECOMPOSEONRESIZE;