Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Fenstererstellungscode (d. h. alles, was geschieht, wenn Sie aufrufen CreateWindow) ist kostspielig auszuführen. Ein Steuerelement, das ein Bildschirmfenster verwaltet, 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 sie im Gegensatz zu fensterorientierten Steuerelementen transparentes Zeichnen und nicht-rechtwinklige Bildschirmbereiche unterstützen. Ein gängiges Beispiel für ein transparentes Steuerelement ist ein Textsteuerelement mit transparentem Hintergrund. Die Bedienelemente malen den Text, aber nicht den Hintergrund, sodass alles, was sich unter dem Text befindet, durchscheint. 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. (Eine Beschreibung dieser Schnittstelle finden Sie im ActiveX SDK.) COleControl-Member-Funktionen 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 " Steuerelementeinstellungen " des MFC ActiveX-Steuerelement-Assistenten auswählen.
Wenn die fensterlose Aktivierung aktiviert ist, delegiert der Container Eingabemeldungen an die Schnittstelle des Steuerelements IOleInPlaceObjectWindowless . Die COleControl-Implementierung dieser Schnittstelle sendet die Nachrichten über die Message Map Ihres Steuerelements, 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 vorher sicherzustellen, dass der Wert nicht NULL ist.
COleControl bietet Elementfunktionen, die je nach Bedarf Mauserfassung, Tastaturfokus, Scrollen und andere Fensterdienste aus dem Container aufrufen, einschließlich:
Bei fensterlosen Steuerelementen sollten Sie immer die COleControl-Memberfunktionen anstelle der entsprechenden CWnd-Memberfunktionen oder der zugehörigen Win32-API-Funktionen verwenden.
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 hat, verwendet der Container ein eigenes Fenster als Ablageziel. 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;
}