Zajišťování aktivace bez oken
Kód pro vytvoření okna (to znamená vše, co se stane při volání funkce CreateWindow) je nákladné spustit.Ovládací prvek, který udržuje na obrazovce má okno Spravovat zprávy okna.Ovládací prvky bez oken je proto rychlejší než ovládací prvky systému windows.
Další výhodou ovládací prvky bez oken je, že na rozdíl od okna Ovládací prvky bez oken ovládací prvky podporují transparentní Malování a oblasti obrazovky jiného než obdélníkového tvaru.Běžným příkladem průhledný ovládací prvek je ovládací prvek text s průhledným pozadím.Ovládací prvky maluje text, ale ne na pozadí, takže vše, co je pod textem prosvítá.Novější formuláře často provádět pomocí jiného než obdélníkového tvaru ovládacích prvků, například šipky a kulatých tlačítek.
Často ovládací prvek nemusí své vlastní okno a místo toho můžete použít okno služby jeho vnitřního obalu, za předpokladu, že bylo zapsáno kontejneru podporují objekty bez oken.Ovládací prvky bez oken jsou zpětně kompatibilní se starší kontejnery.Ve starší kontejnery nebyly vytvořeny pro podporu ovládací prvky bez oken vytvořte ovládací prvky bez oken při aktivní okno.
Protože ovládací prvky bez oken nemají vlastní systém windows, je odpovědné za poskytování služeb, které by jinak byly poskytnuty v okně ovládacího prvku vlastní kontejner (který má okno).Například pokud ovládací prvek musí dotazy fokusu klávesnice, zachycení myši nebo získat kontext zařízení, tyto operace jsou spravovány kontejneru.Kontejner směruje uživatele vstupní zprávy odeslané do jeho okna příslušný ovládací prvek bez oken, pomocí IOleInPlaceObjectWindowless rozhraní. (Viz ActiveX SDK popis tohoto rozhraní.) COleControl členské funkce vyvolání těchto služeb z kontejneru.
Chcete-li ovládací prvek bez oken aktivaci, patří windowlessActivate příznak v sadě vrácené příznaky COleControl::GetControlFlags.Příklad:
DWORD CMyAxOptCtrl::GetControlFlags()
{
DWORD dwFlags = COleControl::GetControlFlags();
...
// The control can activate without creating a window.
dwFlags |= windowlessActivate;
...
return dwFlags;
}
Pokud vyberete automatické generování kódu zahrnout tento příznak bez okna aktivace možnost na Nastavení stránky MFC ActiveX Control Wizard.
Pokud je povolena bez okna aktivace, kontejner bude delegovat zprávy při zadávání ovládacího prvku IOleInPlaceObjectWindowless rozhraní.COleControljeho implementace tohoto rozhraní odešle zprávy prostřednictvím ovládacího prvku mapu zpráv, po nastavení myši správně souřadnice.Přidáním odpovídající položky mapování zpráv dokáže zpracovat zprávy jako běžná okna zprávy.Vaše obslužné rutiny pro tyto zprávy, vyhněte se použití m_hWnd členské proměnné (nebo členskou funkci, která jej používá) bez první kontroly jeho hodnota není NULL.
COleControlPoskytuje členské funkce, které vyvolávají zachycení myši, kurzor klávesnice, posouvání a jiné okno služby z kontejneru, případně včetně:
V ovládací prvky bez oken, vždy používejte COleControl členské funkce místo odpovídající CWnd členské funkce nebo jejich souvisejících funkcí rozhraní API systému Win32.
Můžete ovládací prvek bez oken cíl operace a přetažení OLE.Normálně to by znamenalo, že okno Ovládací prvek zaregistrovat jako cíl přetažení.Protože ovládací prvek nemá žádné okno, kontejner používá vlastním okně jako cíl přetažení.Ovládací prvek poskytuje implementaci IDropTarget rozhraní, do kterého kontejneru můžete delegovat volání v přiměřené době.Vystavení tohoto rozhraní do kontejneru, přepsat COleControl::GetWindowlessDropTarget.Příklad:
IDropTarget* CMyAxOptCtrl::GetWindowlessDropTarget()
{
m_DropTarget.m_xDropTarget.AddRef();
return &m_DropTarget.m_xDropTarget;
}