Share via


Bereitstellen der fensterlose Aktivierung

Fenster fest (das heißt Code alles der Fall, wenn Sie CreateWindow aufrufen), ist aufwändig auszuführen.Ein Steuerelement, das ein Fenster auf dem Bildschirm wartet, muss Meldungen für das Fenster verwalten.Fensterlose Steuerelemente sind deshalb Steuerelementen schneller als bei Windows.

Ein weiterer Vorteil von fensterlosen Steuerelementen besteht darin, dass Steuerelemente mit Fenstern unterschiedlich fensterlose Steuerelemente transparentes Zeichnen und nonrectangular Bildschirm Bereiche unterstützen.Ein allgemeines Beispiel für einen transparenten Steuerelements handelt es sich um ein Text-Steuerelement mit einem transparenten Hintergrund.Die Steuerelementen erfassen den Text, jedoch nicht den Hintergrund, sodass, was unter dem Text handelt, wird durch dar.Neuere Formularen häufig nutzen nonrectangular Steuerelemente, z. B. Schaltflächen öffnende und Pfeilen aus.

Häufig benötigt ein Steuerelement keine eigenen Fenster und kann die Windows-Dienste verwenden Sie stattdessen des zugehörigen Containers, wenn der Container geschrieben wurde, die fensterlose Objekte unterstützen.Fensterlose Steuerelemente sind mit älteren Containern abwärts kompatibel.In älteren Containern, die fensterlose nicht geschrieben werden, um Steuerelemente zu unterstützen, stellen die fensterlosen Steuerelemente erstellt, wenn ein Fenster aktiv.

Da fensterlose Steuerelemente keine eigenen Fenster haben, ist der Container (der ein Fenster besitzt) für die Bereitstellung von Diensten verantwortlich, die andernfalls von eigenen Fenster des Steuerelements bereitgestellt worden wären.Wenn z. B. das Steuerelement den Tastaturfokus abfragen, die Maus erfassen oder erhalten muss es sich um einen Gerätekontext, werden diese Vorgänge vom Container verwaltet.Der Container leitet der Benutzer weiter Meldungen in das Fenster in den entsprechenden fensterlosen Steuerelement unter Verwendung der IOleInPlaceObjectWindowless-Schnittstelle gesendet werden.(Siehe das ActiveX SDK zur Beschreibung dieser Schnittstelle.), rufen COleControl-Memberfunktionen diese Dienste vom Container auf.

Um das Steuerelement zu verwendende Aktivierung fensterlose, schließen Sie das windowlessActivate -Flag im Satz von Flags, die vom COleControl::GetControlFlags zurückgegeben werden.Beispiele:

DWORD CMyAxOptCtrl::GetControlFlags()
{
   DWORD dwFlags = COleControl::GetControlFlags();


...


// The control can activate without creating a window.
dwFlags |= windowlessActivate;


...


   return dwFlags;
}

Der Code, um dieses Flags eingeschlossen wird automatisch generiert, wenn Sie die Option Fensterlose Aktivierung auf der Steuerelementeinstellungen Seite des MFC-ActiveX-Steuerelement-Assistenten auswählen.

Wenn fensterlose Aktivierung aktiviert wird, delegiert an die Eingabemeldungen der Container IOleInPlaceObjectWindowless-Schnittstelle des Steuerelements.Die Implementierung dieser Schnittstelle von COleControl leitet Nachrichten von der Meldungszuordnung des Steuerelements, nach der die Mauskoordinaten entsprechend anpassen.Sie können die Fenstermeldungen wie gewöhnliche Meldungen verarbeiten, indem Sie die entsprechenden Buchungen zur Meldungszuordnung hinzufügen.In den Handlern für diese Meldungen vermeiden Sie die m_hWnd-Membervariable (oder eine Memberfunktion, die sie verwendet), ohne erste Überprüfung zu verwenden, dass der Wert nicht NULL ist.

COleControl stellt die Memberfunktionen, die Mausauswahl Tastaturfokus Bildlaufs und andere Windows-Dienste vom Container bei Bedarf aufrufen, einschließlich:

In den fensterlosen Steuerelemente sollten Sie die COleControl-Memberfunktionen anstelle der entsprechenden CWnd-Memberfunktionen oder ihrer verwandten Win32-API-Funktionen immer verwenden.

Sie sollten ein fensterloses Steuerelement das Ziel eines OLE-Drag & Drop-Vorgangs sein.Normalerweise ist dies erfordern, dass das Fenster des Steuerelements als Ablageziel registriert ist.Da das Steuerelement keine eigenen Fenster hat, verwendet der Container sein eigenes Fenster als Ablageziel.Das Steuerelement stellt eine Implementierung der Schnittstelle IDropTarget, zu der der Container Aufrufe zum entsprechenden Zeitpunkt delegieren kann.Um diese Schnittstelle verfügbar machen, Überschreibung COleControl::GetWindowlessDropTarget dem Container.Beispiele:

IDropTarget* CMyAxOptCtrl::GetWindowlessDropTarget()
{
   m_DropTarget.m_xDropTarget.AddRef();
   return &m_DropTarget.m_xDropTarget;
}

Siehe auch

Konzepte

MFC-ActiveX-Steuerelemente: Optimierung