Share via


Activering zonder venster bieden

Het maken van venstercode (dat wil gezegd, alles wat gebeurt wanneer u aanroept CreateWindow) is kostbaar om uit te voeren. Een besturingselement dat een schermvenster onderhoudt, moet berichten voor het venster beheren. Vensterloze besturingselementen zijn daarom sneller dan besturingselementen met vensters.

Een ander voordeel van vensterloze besturingselementen is dat, in tegenstelling tot vensterbesturingselementen, vensterloze besturingselementen transparante schilder- en niet-verstrengelde schermgebieden ondersteunen. Een veelvoorkomend voorbeeld van een transparant besturingselement is een tekst besturingselement met een transparante achtergrond. De besturingselementen geven de tekst weer, maar laten de achtergrond ongeveranderd, zodat wat er onder de tekst staat, zichtbaar is. Nieuwere vormen maken vaak gebruik van niet-verstrengelde besturingselementen, zoals pijlen en ronde knoppen.

Een besturingselement heeft vaak geen eigen venster nodig en kan in plaats daarvan de vensterservices van de container gebruiken, mits de container is geschreven om vensterloze objecten te ondersteunen. Besturingselementen zonder venster zijn achterwaarts compatibel met oudere containers. In oudere containers die niet zijn geschreven om vensterloze besturingselementen te ondersteunen, maken de besturingselementen zonder venster een venster wanneer ze actief zijn.

Omdat besturingselementen zonder vensters geen eigen vensters hebben, is de container (die wel een venster heeft) verantwoordelijk voor het leveren van services die anders zouden zijn geleverd door het eigen venster van het besturingselement. Als uw besturingselement bijvoorbeeld query's moet uitvoeren op de toetsenbordfocus, de muis moet vastleggen of een apparaatcontext moet verkrijgen, worden deze bewerkingen beheerd door de container. De container routeert gebruikersinvoerberichten die naar het venster zijn verzonden naar het juiste vensterloze beheer, met behulp van de IOleInPlaceObjectWindowless interface. (Zie de ActiveX SDK voor een beschrijving van deze interface.) COleControl lidfuncties roepen deze services aan vanuit de container.

Als u wilt dat uw besturingselement vensterloze activering gebruikt, neemt u de vlag windowlessActivate op in de set vlaggen die worden geretourneerd door COleControl::GetControlFlags. Voorbeeld:

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

De code voor het opnemen van deze vlag wordt automatisch gegenereerd als u de optie voor activering zonder venster selecteert op de pagina Instellingen van het besturingselement van de MFC ActiveX-wizard.

Wanneer vensterloze activering is ingeschakeld, delegeert de container invoerberichten naar de interface van IOleInPlaceObjectWindowless het besturingselement. COleControlDe implementatie van deze interface verzendt de berichten via de berichtenkaart van uw besturingselement, nadat de muiscoördinaten op de juiste wijze zijn aangepast. U kunt de berichten net als gewone vensterberichten verwerken door de corresponderende vermeldingen toe te voegen aan de berichtenmap. Vermijd in uw handlers voor deze berichten het gebruik van de m_hWnd lidvariabele (of een lidfunctie die deze gebruikt) zonder eerst te controleren of de waarde niet NULL is.

COleControl biedt lidfuncties die muisopname, toetsenbordfocus, scrollen en andere vensterservices van de container aanroepen, waaronder:

In vensterloze besturingselementen moet u altijd de COleControl lidfuncties gebruiken in plaats van de bijbehorende CWnd lidfuncties of de bijbehorende Win32 API-functies.

Het kan zijn dat u een bedieningselement zonder venster als doel van een OLE-sleep-en-neerzetbewerking wilt instellen. Normaal gesproken vereist dit dat het venster van het besturingselement wordt geregistreerd als een doel voor slepen-en-neerzetten. Omdat het besturingselement geen eigen venster heeft, gebruikt de container een eigen venster als een doel voor neerzetten. Het besturingselement biedt een implementatie van de IDropTarget interface waarnaar de container oproepen op het juiste moment kan delegeren. Als u deze interface beschikbaar wilt maken voor de container, overschrijft u COleControl::GetWindowlessDropTarget. Voorbeeld:

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

Zie ook

MFC ActiveX-besturingselementen: Optimalisatie