Bereitstellung von fensterloser Aktivierung

Fenstererstellungscode (d. h. alles, was geschieht, wenn Sie aufrufen CreateWindow) ist kostspielig auszuführen. Ein Steuerelement, das ein Bildschirmfenster enthält Standard, muss Nachrichten für das Fenster verwalten. Fensterlose Steuerelemente sind daher schneller als Steuerelemente mit Fenstern.

Ein weiterer Vorteil von fensterlosen Steuerelementen besteht darin, dass fensterlose Steuerelemente im Gegensatz zu fensterlosen Steuerelementen transparentes Zeichnen und nicht-ectangulare Bildschirmbereiche unterstützen. Ein gängiges Beispiel für ein transparentes Steuerelement ist ein Textsteuerelement mit transparentem Hintergrund. Die Steuerelemente zeichnen den Text, aber nicht den Hintergrund, sodass alles unter dem Text angezeigt wird. Neuere Formulare verwenden häufig nicht-rekangulare Steuerelemente, z. B. Pfeile und abgerundete Schaltflächen.

Häufig benötigt ein Steuerelement kein eigenes Fenster und kann stattdessen die Fensterdienste seines Containers verwenden, vorausgesetzt, der Container wurde geschrieben, um fensterlose Objekte zu unterstützen. Fensterlose Steuerelemente sind abwärtskompatibel mit älteren Containern. In älteren Containern, die nicht zur Unterstützung von fensterlosen Steuerelementen geschrieben wurden, erstellen die fensterlosen Steuerelemente ein Fenster, wenn sie aktiv sind.

Da fensterlose Steuerelemente nicht über eigene Fenster verfügen, ist der Container (der über ein Fenster verfügt) für die Bereitstellung von Diensten verantwortlich, die andernfalls vom eigenen Fenster des Steuerelements bereitgestellt wurden. Wenn Ihr Steuerelement beispielsweise den Tastaturfokus abfragen, die Maus erfassen oder einen Gerätekontext abrufen muss, werden diese Vorgänge vom Container verwaltet. Der Container leitet Benutzereingabemeldungen, die an sein Fenster gesendet werden, mithilfe der IOleInPlaceObjectWindowless Schnittstelle an das entsprechende fensterlose Steuerelement weiter. (Siehe ActiveX SDK für eine Beschreibung dieser Schnittstelle.) COleControl Memberfunktionen rufen diese Dienste aus dem Container auf.

Um das Steuerelement fensterlos zu aktivieren, schließen Sie das windowlessActivate-Flag in den Satz von Flags ein, die von COleControl::GetControlFlags zurückgegeben werden. Beispiel:

DWORD CMyAxOptCtrl::GetControlFlags()
{
   DWORD dwFlags = COleControl::GetControlFlags();
// The control can activate without creating a window.
dwFlags |= windowlessActivate;
return dwFlags;
}

Der Code zum Einschließen dieses Flags wird automatisch generiert, wenn Sie die Option "Fensterlose Aktivierung" auf der Seite "Steuerelement Einstellungen" des MFC ActiveX-Steuerelement-Assistenten auswählen.

Wenn die fensterlose Aktivierung aktiviert ist, delegiert der Container Eingabemeldungen an die Schnittstelle des Steuerelements IOleInPlaceObjectWindowless . COleControlDie Implementierung dieser Schnittstelle verteilt die Nachrichten über die Nachrichtenzuordnung Ihres Steuerelements, nachdem sie die Mauskoordinaten entsprechend angepasst haben. 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.

COleControl stellt Memberfunktionen bereit, die ggf. Mauserfassung, Tastaturfokus, Bildlauf und andere Fensterdienste aus dem Container aufrufen, einschließlich:

In fensterlosen Steuerelementen sollten Sie die Memberfunktionen immer anstelle der entsprechenden CWnd Memberfunktionen oder der zugehörigen Win32-API-Funktionen verwendenCOleControl.

Möglicherweise soll ein fensterloses Steuerelement das Ziel eines OLE-Drag-and-Drop-Vorgangs sein. Normalerweise würde dies erfordern, dass das Fenster des Steuerelements als Drop-Ziel registriert wird. Da das Steuerelement kein eigenes Fenster besitzt, verwendet der Container ein eigenes Fenster als Drop-Ziel. Das Steuerelement stellt eine Implementierung der IDropTarget Schnittstelle bereit, an die der Container Aufrufe zur entsprechenden Zeit delegieren kann. Um diese Schnittstelle für den Container verfügbar zu machen, überschreiben Sie COleControl::GetWindowlessDropTarget. Beispiel:

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

Siehe auch

MFC-ActiveX-Steuerelemente: Optimierung