Bereitstellen von Mausinteraktionen in inaktiven Steuerelementen
Wenn das Steuerelement nicht sofort aktiviert ist, sollten Sie jedoch WM_SETCURSOR und WM_MOUSEMOVE aufrufen, obwohl das Steuerelement kein Fenster von eigenen hat. Dies kann erreicht werden, indem COleControl Implementierung der Schnittstelle IPointerInactive aktiviert, die standardmäßig deaktiviert ist. (Siehe das ActiveX-SDK für eine Beschreibung dieser Schnittstelle.) Um sie zu aktivieren, fügen Sie das pointerInactive-Flag im 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, mit dem dieses Flags einzuschließen wird automatisch generiert, wenn Sie die Option Mauszeiger-Benachrichtigung wenn inaktiv auf der Seite Steuerelementeinstellungen auswählen, wenn Sie das Steuerelement mit MFC-ActiveX-Steuerelement-Assistent erstellen.
Wenn die IPointerInactive-Schnittstelle aktiviert wird, delegiert der Container WM_SETCURSOR und WM_MOUSEMOVE Meldungen dorthin. COleControl Implementierung von IPointerInactive leitet die Meldungen durch die Meldungszuordnung des Steuerelements weiter, nachdem die Mauskoordinaten entsprechend anpassen. Sie können die Meldungen wie gewöhnliche Fenstermeldungen verarbeiten, indem Sie den entsprechenden Einträgen zur Meldungszuordnung hinzufügen. In den Handler für diese Meldungen, vermeiden Sie es, die m_hWnd-Membervariable (oder eine Memberfunktion, die sie verwendet), ohne zuerst die Prüfung zu verwenden, dass der Wert nicht NULL ist.
Sie können auch ein Präprozessordirektiven Steuerelement das Ziel eines Drag & Drop-Vorgangs sein. Dies erfordert das Aktivieren des Steuerelements, in dem von Ihnen angegebenen Zeitpunkt als der Benutzer ein Objekt darüber zieht, sodass das Fenster des Steuerelements als Ablageziel registriert werden kann. Um Aktivierung zu bewirken während eines Ziehvorgangs fungiert, überschreiben Sie COleControl::GetActivationPolicy und geben Sie das Flag POINTERINACTIVE_ACTIVATEONDRAG zurück:
DWORD CMyAxOptCtrl::GetActivationPolicy()
{
return POINTERINACTIVE_ACTIVATEONDRAG;
}
Die IPointerInactive-Schnittstelle zu aktivieren bedeutet normalerweise, dass Sie das Steuerelement an Mausmeldungen jederzeit verarbeiten Lage sein soll. Um dieses Verhalten in einem Container abzurufen der nicht die IPointerInactive-Schnittstelle unterstützt, müssen Sie das Steuerelement, das immer falls sichtbar aktiviert ist, das heißt dass das Steuerelement das Flag OLEMISC_ACTIVATEWHENVISIBLE unter den verschiedenen Flags enthalten soll. Um zu verhindern dass dieses Flag in einem Container, der IPointerInactive unterstützt, können Sie das OLEMISC_IGNOREACTIVATEWHENVISIBLE-Flag auch angeben wirksam wird:
static const DWORD BASED_CODE _dwMyOleMisc =
OLEMISC_ACTIVATEWHENVISIBLE |
OLEMISC_IGNOREACTIVATEWHENVISIBLE |
OLEMISC_SETCLIENTSITEFIRST |
OLEMISC_INSIDEOUT |
OLEMISC_CANTLINKINSIDE |
OLEMISC_RECOMPOSEONRESIZE;