Bereitstellen von Mausinteraktionen in inaktiven Steuerelementen

Wenn Ihr Steuerelement nicht sofort aktiviert wird, möchten Sie es möglicherweise trotzdem WM_SETCURSOR und WM_MOUSEMOVE Nachrichten verarbeiten, auch wenn das Steuerelement kein eigenes Fenster besitzt. Dies kann erreicht werden, indem COleControldie Implementierung der IPointerInactive Schnittstelle aktiviert wird, die standardmäßig deaktiviert ist. (Siehe ActiveX SDK für eine Beschreibung dieser Schnittstelle.) Um dies zu aktivieren, schließen Sie das pointerInactive-Flag in den Satz von Flags ein, die von COleControl::GetControlFlags zurückgegeben werden:

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

Der Code zum Einschließen dieses Flags wird automatisch generiert, wenn Sie die Option "Mauszeigerbenachrichtigungen wenn inaktiv" auf der Seite "Steuerelement" Einstellungen beim Erstellen des Steuerelements mit dem MFC ActiveX-Steuerelement-Assistenten auswählen.

Wenn die IPointerInactive Schnittstelle aktiviert ist, delegiert der Container WM_SETCURSOR und WM_MOUSEMOVE Nachrichten an die Schnittstelle. COleControlDie Implementierung der IPointerInactive Nachrichten wird durch die Nachrichtenzuordnung Ihres Steuerelements verteilt, nachdem die Mauskoordinaten entsprechend angepasst wurden. Sie können die Nachrichten wie normale Fensternachrichten verarbeiten, indem Sie die entsprechenden Einträge zur Nachrichtenzuordnung hinzufügen. Vermeiden Sie in Den Handlern für diese Meldungen die Verwendung der m_hWnd Membervariable (oder einer Memberfunktion, die sie verwendet), ohne zuerst zu überprüfen, ob der Wert nicht NULL ist.

Möglicherweise möchten Sie auch, dass ein inaktives Steuerelement das Ziel eines OLE-Drag-and-Drop-Vorgangs ist. Dies erfordert die Aktivierung des Steuerelements im Moment, in dem der Benutzer ein Objekt darüber zieht, sodass das Fenster des Steuerelements als Drop-Ziel registriert werden kann. Um die Aktivierung während eines Ziehens zu verursachen, überschreiben Sie COleControl::GetActivationPolicy, und geben Sie das POINTERINACTIVE_ACTIVATEONDRAG Flag zurück:

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

Das Aktivieren der Schnittstelle bedeutet in der IPointerInactive Regel, dass das Steuerelement jederzeit Mausnachrichten verarbeiten kann. Um dieses Verhalten in einem Container zu erhalten, der die IPointerInactive Schnittstelle nicht unterstützt, müssen Sie das Steuerelement immer aktiviert lassen, wenn es sichtbar ist. Das Bedeutet, dass das Steuerelement das OLEMISC_ACTIVATEWHENVISIBLE Flag unter den verschiedenen Flags enthalten soll. Um jedoch zu verhindern, dass dieses Flag in einem Container wirksam wird, der unterstützt IPointerInactivewird, können Sie auch das OLEMISC_IGNOREACTIVATEWHENVISIBLE Flag angeben:

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

Siehe auch

MFC-ActiveX-Steuerelemente: Optimierung