Inserimento di interazione del mouse in stato di inattività

Se il controllo non è attivato immediatamente, può comunque essere necessario elaborare WM_edizione Standard TCURSOR e WM_MOUedizione Standard MESSAGGIMOVE, anche se il controllo non ha una finestra di propria proprietà. Questa operazione può essere eseguita abilitando COleControll'implementazione dell'interfaccia IPointerInactive , che è disabilitata per impostazione predefinita. (Vedere il ActiveX SDK per una descrizione di questa interfaccia. Per abilitarla, includere il flag pointerInactive nel set di flag restituiti da COleControl::GetControlFlags:

DWORD CMyAxOptCtrl::GetControlFlags()
{
   DWORD dwFlags = COleControl::GetControlFlags();
// The control can receive mouse notifications when inactive.
dwFlags |= pointerInactive;
return dwFlags;
}

Il codice da includere questo flag viene generato automaticamente se si seleziona l'opzione Notifiche del puntatore del mouse quando non è attiva nella pagina Controllo Impostazioni durante la creazione del controllo con la Creazione guidata controllo ActiveX MFC.

Quando l'interfaccia IPointerInactive è abilitata, il contenitore delega i messaggi WM_edizione Standard TCURSOR e WM_MOUedizione Standard MOVE. COleControlL'implementazione di IPointerInactive invia i messaggi tramite la mappa dei messaggi del controllo dopo aver modificato le coordinate del mouse in modo appropriato. È possibile elaborare i messaggi esattamente come i normali messaggi della finestra aggiungendo le voci corrispondenti alla mappa dei messaggi. Nei gestori di questi messaggi evitare di usare la variabile membro m_hWnd (o qualsiasi funzione membro che la usa) senza prima verificare che il relativo valore non sia NULL.

È anche possibile che un controllo inattivo sia la destinazione di un'operazione di trascinamento della selezione OLE. Ciò richiede l'attivazione del controllo nel momento in cui l'utente trascina un oggetto su di esso, in modo che la finestra del controllo possa essere registrata come destinazione di rilascio. Per causare l'attivazione durante un trascinamento, eseguire l'override di COleControl::GetActivationPolicy e restituire il flag POINTERINACTIVE_ACTIVATEONDRAG:

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

L'abilitazione dell'interfaccia IPointerInactive significa in genere che il controllo sia in grado di elaborare sempre i messaggi del mouse. Per ottenere questo comportamento in un contenitore che non supporta l'interfaccia IPointerInactive , è necessario che il controllo sia sempre attivato quando visibile, il che significa che il controllo deve includere il flag OLEMISC_ACTIVATEWHENVISIBLE tra i flag vari. Tuttavia, per impedire che questo flag abbia effetto in un contenitore che supporta IPointerInactive, è anche possibile specificare il flag OLEMISC_IGNOREACTIVATEWHENVISIBLE:

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

Vedi anche

Controlli ActiveX MFC: ottimizzazione