MFC – ovládací prvky ActiveX: Vytvoření podtřídy ovládacího prvku systému Windows
Tento článek popisuje proces podtřídy společného ovládacího prvku Windows k vytvoření ovládacího prvku technologie ActiveX. Podtřídy existujícího ovládacího prvku Windows jsou rychlým způsobem vývoje ovládacího prvku technologie ActiveX. Nový ovládací prvek bude mít možnosti podtříděného ovládacího prvku Windows, jako je malování a reakce na kliknutí myší. Ukázka tlačítka technologie ActiveX ovládacích prvků MFC je příkladem podtřídy ovládacího prvku Windows.
Důležité
technologie ActiveX je starší technologie, která by se neměla používat pro nový vývoj. Další informace o moderních technologiích, které nahrazují technologie ActiveX, najdete v tématu technologie ActiveX Ovládací prvky.
Pokud chcete podtřídu podtřídy ovládacího prvku Windows, proveďte následující úlohy:
Přepsání členské funkce IsSubclassedControl a PreCreateWindow COleControl
Zpracování všech technologie ActiveX řídicích zpráv (OCM) se projeví u ovládacího prvku.
Poznámka
Většinu této práce provádí průvodce technologie ActiveX ovládacími prvky, pokud vyberete ovládací prvek, který má být podtříděn pomocí rozevíracího seznamu Vybrat nadřazenou třídu okna na stránce Nastavení ovládacího prvku.
Přepsání IsSubclassedControl a PreCreateWindow
Chcete-li přepsat PreCreateWindow
a IsSubclassedControl
přidat následující řádky kódu do protected
oddílu deklarace třídy control:
virtual BOOL PreCreateWindow(CREATESTRUCT& cs);
BOOL IsSubclassedControl();
V souboru implementace ovládacího prvku (. CPP) přidejte následující řádky kódu pro implementaci dvou přepsaných funkcí:
// CMyAxSubCtrl::PreCreateWindow - Modify parameters for CreateWindowEx
BOOL CMyAxSubCtrl::PreCreateWindow(CREATESTRUCT& cs)
{
cs.lpszClass = _T("BUTTON");
return COleControl::PreCreateWindow(cs);
}
// CMyAxSubCtrl::IsSubclassedControl - This is a subclassed control
BOOL CMyAxSubCtrl::IsSubclassedControl()
{
return TRUE;
}
Všimněte si, že v tomto příkladu je ovládací prvek tlačítko Windows zadán v PreCreateWindow
. Všechny standardní ovládací prvky Windows ale můžou být podtříděné. Další informace o standardních ovládacích prvcích Windows naleznete v tématu Ovládací prvky.
Při podtřídě ovládacího prvku Windows můžete chtít určit konkrétní styl okna (WS_) nebo rozšířené příznaky stylu okna (WS_EX_), které se mají použít při vytváření okna ovládacího prvku. Hodnoty pro tyto parametry v PreCreateWindow
členské funkci můžete nastavit úpravou cs.style
polí struktury a cs.dwExStyle
struktury. Změny těchto polí by měly být provedeny pomocí operace OR , aby se zachovaly výchozí příznaky, které jsou nastaveny třídou COleControl
. Pokud je například ovládací prvek podtřídě ovládací prvek BUTTON a chcete, aby se ovládací prvek zobrazil jako zaškrtávací políčko, vložte následující řádek kódu do implementace CSampleCtrl::PreCreateWindow
příkazu return:
cs.style |= BS_CHECKBOX;
Tato operace přidá příznak stylu BS_CHECKBOX a zároveň ponechá výchozí příznak stylu (WS_CHILD) třídy COleControl
beze změny.
Úprava členské funkce OnDraw
Pokud chcete, aby podtříděný ovládací prvek zachoval stejný vzhled jako odpovídající ovládací prvek Windows, OnDraw
měla by členová funkce ovládacího prvku obsahovat pouze volání DoSuperclassPaint
členské funkce, jako v následujícím příkladu:
void CMyAxSubCtrl::OnDraw(CDC* pdc, const CRect& rcBounds, const CRect& /*rcInvalid*/)
{
if (!pdc)
return;
DoSuperclassPaint(pdc, rcBounds);
}
Členová DoSuperclassPaint
funkce implementovaná COleControl
pomocí , používá proceduru okna ovládacího prvku Windows k vykreslení ovládacího prvku v zadaném kontextu zařízení v ohraničující obdélník. Ovládací prvek tak bude viditelný i v případě, že není aktivní.
Poznámka
Členová DoSuperclassPaint
funkce bude fungovat pouze s typy ovládacích prvků, které umožňují předávání kontextu zařízení jako wParam zprávy WM_PAINT. To zahrnuje některé ze standardních ovládacích prvků Windows, jako je SCROLLBAR a BUTTON, a všechny společné ovládací prvky. U ovládacích prvků, které toto chování nepodporují, budete muset zadat vlastní kód, aby se správně zobrazil neaktivní ovládací prvek.
Zpracování Reflexe zpráv okna
Ovládací prvky Windows obvykle odesílají určité zprávy okna do nadřazeného okna. Některé z těchto zpráv, například WM_COMMAND, poskytují oznámení o akci uživatelem. Jiné, například WM_CTLCOLOR, slouží k získání informací z nadřazeného okna. Ovládací prvek technologie ActiveX obvykle komunikuje s nadřazeným oknem jinými prostředky. Oznámení jsou komunikována aktivací událostí (odesíláním oznámení událostí) a informace o řídicím kontejneru se získávají přístupem k okolním vlastnostem kontejneru. Vzhledem k tomu, že tyto komunikační techniky existují, technologie ActiveX kontejnery ovládacích prvků se neočekávají ke zpracování žádných zpráv oken odesílaných ovládacím prvku.
Pokud chcete zabránit tomu, aby kontejner přijímal zprávy okna odeslané podtřídou ovládacím prvku Windows, vytvoří další okno, COleControl
které bude sloužit jako nadřazený prvek ovládacího prvku. Toto dodatečné okno označované jako reflektor se vytvoří pouze pro ovládací prvek technologie ActiveX, který podtřídí ovládací prvek Windows a má stejnou velikost a pozici jako okno ovládacího prvku. Okno reflektoru zachycuje určité zprávy okna a odesílá je zpět do ovládacího prvku. Ovládací prvek v jeho okně procedura pak může zpracovat tyto reflektované zprávy tím, že provede akce vhodné pro ovládací prvek technologie ActiveX (například aktivaci události). V části Reflexe ID zpráv okna najdete seznam zachycených zpráv oken a jejich odpovídajících reflektovaných zpráv.
Kontejner ovládacího prvku technologie ActiveX může být navržen tak, aby prováděl reflexi zprávy sám, což eliminuje potřebu COleControl
vytvořit okno reflektoru a snížit režii za běhu pro podtříděný ovládací prvek Windows. COleControl
zjistí, zda kontejner tuto funkci podporuje, vyhledáním vlastnosti Message Reflexe okolí s hodnotou TRUE.
Pokud chcete zpracovat reflektující zprávu okna, přidejte do mapy řídicích zpráv položku a implementujte funkci obslužné rutiny. Vzhledem k tomu, že reflektované zprávy nejsou součástí standardní sady zpráv definovaných systémem Windows, zobrazení tříd nepodporuje přidání takových obslužných rutin zpráv. Není však obtížné přidat obslužnou rutinu ručně.
Pokud chcete přidat obslužnou rutinu zprávy pro reflektující zprávu okna ručně, postupujte následovně:
Ve třídě ovládacího prvku . Soubor H deklarujte funkci obslužné rutiny. Funkce by měla mít návratový typ LRESULT a dva parametry s typy WPARAM a LPARAM. Příklad:
class CMyAxSubCtrl : public COleControl {
protected: LRESULT OnOcmCommand(WPARAM wParam, LPARAM lParam); };
Ve třídě ovládacího prvku . Soubor CPP přidejte do mapy zpráv ON_MESSAGE položku. Parametry této položky by měly být identifikátorem zprávy a názvem funkce obslužné rutiny. Příklad:
BEGIN_MESSAGE_MAP(CMyAxSubCtrl, COleControl) ON_MESSAGE(OCM_COMMAND, &CMyAxSubCtrl::OnOcmCommand) END_MESSAGE_MAP()
Také v . Soubor CPP implementujte členovou
OnOcmCommand
funkci, která zpracuje zrcadlenou zprávu. Parametry wParam a lParam jsou stejné jako parametry původní zprávy okna.
Příklad zpracování reflektovaných zpráv najdete v ukázkovém tlačítku technologie ActiveX ovládacích prvků MFC. Ukazuje obslužnou rutinu OnOcmCommand
, která detekuje kód oznámení BN_CLICKED a reaguje aktivací (odesláním Click
) události.