Zajišťování aktivace bez oken
Kód pro vytvoření okna (to znamená vše, co se děje při volání CreateWindow
) je nákladné provést. Ovládací prvek, který udržuje okno na obrazovce, musí spravovat zprávy pro okno. Ovládací prvky bez oken jsou proto rychlejší než ovládací prvky s okny.
Další výhodouovládacíchm prvkům bez oken je, že na rozdíl od okenních ovládacích prvků podporují průhledné obrazové prvky a oblasti obrazovky bez oken. Běžným příkladem průhledného ovládacího prvku je textový ovládací prvek s průhledným pozadím. Ovládací prvky malují text, ale ne pozadí, takže cokoli je pod textem. Novější formuláře často využívají nerectangulární ovládací prvky, jako jsou šipky a kulaté tlačítka.
Ovládací prvek často nepotřebuje vlastní okno a místo toho může používat služby oken svého kontejneru za předpokladu, že kontejner byl zapsán pro podporu objektů bez oken. Ovládací prvky bez oken jsou zpětně kompatibilní se staršími kontejnery. Vestarších
Vzhledem k tomu, že ovládací prvky bez oken nemají vlastní okna, je kontejner (který obsahuje okno) zodpovědný za poskytování služeb, které by jinak poskytl vlastní okno ovládacího prvku. Pokud například váš ovládací prvek potřebuje dotazovat fokus klávesnice, zachytit myš nebo získat kontext zařízení, tyto operace se spravují kontejnerem. Kontejner směruje vstupní zprávy uživatele odeslané do okna do příslušného ovládacího prvku bez oken pomocí IOleInPlaceObjectWindowless
rozhraní. (Viz technologie ActiveX SDK pro popis tohoto rozhraní.) COleControl
členské funkce volají tyto služby z kontejneru.
Chcete-li, aby ovládací prvek používal aktivaci bez oken, zahrňte příznak windowlessActivate do sady příznaků vrácených COleControl::GetControlFlags. Příklad:
DWORD CMyAxOptCtrl::GetControlFlags()
{
DWORD dwFlags = COleControl::GetControlFlags();
// The control can activate without creating a window.
dwFlags |= windowlessActivate;
return dwFlags;
}
Kód, který má tento příznak zahrnout, se automaticky vygeneruje, pokud vyberete možnost aktivace bez oken na stránce ovládacích prvků Nastavení Průvodce ovládacími prvky MFC technologie ActiveX.
Pokud je povolená aktivace bez oken, kontejner deleguje vstupní zprávy do rozhraní ovládacího prvku IOleInPlaceObjectWindowless
. COleControl
Implementace tohoto rozhraní odesílá zprávy prostřednictvím mapy zpráv ovládacího prvku po správné úpravě souřadnic myši. Zprávy, jako jsou běžné zprávy okna, můžete zpracovat přidáním odpovídajících položek do mapy zpráv. V obslužných rutinách pro tyto zprávy nepoužívejte m_hWnd členské proměnné (nebo jakékoli členské funkce, která ji používá) bez první kontroly, že její hodnota není NULL.
COleControl
poskytuje členské funkce, které podle potřeby volají zachytávání myši, fokus klávesnice, posouvání a další služby oken z kontejneru, včetně:
V ovládacích prvcích bez oken byste měli vždy používat COleControl
členské funkce místo odpovídajících CWnd
členských funkcí nebo jejich souvisejících funkcí rozhraní API Win32.
Můžete chtít, aby ovládací prvek bez oken byl cílem operace přetažení a přetažení OLE. Obvykle by to vyžadovalo, aby bylo okno ovládacího prvku registrováno jako cíl pro odstranění. Vzhledem k tomu, že ovládací prvek nemá vlastní okno, kontejner používá jako cíl přetažení vlastní okno. Ovládací prvek poskytuje implementaci IDropTarget
rozhraní, na které může kontejner delegovat volání v příslušné době. Chcete-li zpřístupnit toto rozhraní kontejneru, přepište COleControl::GetWindowlessDropTarget. Příklad:
IDropTarget* CMyAxOptCtrl::GetWindowlessDropTarget()
{
m_DropTarget.m_xDropTarget.AddRef();
return &m_DropTarget.m_xDropTarget;
}