MFC – ovládací prvky ActiveX: Vytvoření podtřídy ovládacího prvku systému Windows
Tento článek popisuje proces subclassing běžné ovládací prvek systému Windows Chcete-li vytvořit ovládací prvek ActiveX.Subclassing existující Windows ovládací prvek je rychlý způsob, jak vytvořit ovládací prvek ActiveX.Nový ovládací prvek bude mít schopnosti subclassed Windows ovládací prvek, například Malování a reagovat na kliknutí myší.Ukázkový ovládací prvky ActiveX knihovny MFC tlačítko je příkladem subclassing ovládací prvky pro Windows.
Do podtřídy ovládací prvek systému Windows proveďte následující úlohy:
Přepsat členské funkce IsSubclassedControl a PreCreateWindow COleControl
Upravte členskou funkci OnDraw
Zpracovat všechny ActiveX ovládací prvek zprávy (OCM) projeví na ovládací prvek
[!POZNÁMKA]
Velkou část této práce se děje pomocí Průvodce ovládacím prvkem ActiveX při výběru být rozčlenění pomocí ovládacího prvku Vyberte nadřazenou třídu okna rozevíracího seznamu na Nastavení stránky.
Naleznete v článku Q243454 znalostní báze Knowledge Base další informace o subclassing ovládacího prvku.
Přepsání IsSubclassedControl a PreCreateWindow
Chcete-li přepsat PreCreateWindow a IsSubclassedControl, přidejte následující řádky kódu protected část deklarace třídy ovládacího prvku:
virtual BOOL PreCreateWindow(CREATESTRUCT& cs);
BOOL IsSubclassedControl();
V souboru implementace ovládacího prvku (.CPP), přidejte následující řádky kódu provádět dvě přepsané funkce:
// 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 Windows tlačítko ovládacího prvku je určena v PreCreateWindow.Všechny standardní ovládací prvky systému Windows však může být rozčlenění.Další informace o standardních ovládacích prvků systému Windows naleznete v tématu prvky.
Při subclassing ovládací prvek systému Windows, můžete zadat konkrétní okno Styl (WS_) nebo rozšířený styl okna (WS_EX_) příznaky, které má být použit při vytváření ovládacího prvku.Můžete nastavit hodnoty těchto ukazatelů PreCreateWindow členské funkce změnou cs.style a cs.dwExStyle strukturu polí.Změny těchto polí je třeba používat OR operace, chcete-li zachovat výchozí příznaky, které jsou nastaveny pomocí třídy COleControl.Například pokud je ovládací prvek subclassing ovládacího prvku tlačítko a chcete ovládací prvek se zobrazí jako zaškrtávací políčko, vložte následující řádek kódu do provádění CSampleCtrl::PreCreateWindow, před příkaz return:
cs.style |= BS_CHECKBOX;
Tato operace přidá BS_CHECKBOX stylu vlajky, přičemž výchozí styl příznak (WS_CHILD) třídy COleControl beze změny.
Změna funkce OnDraw členské
Pokud chcete, aby ovládací prvek subclassed zachovat stejný vzhled jako odpovídající ovládací prvek systému Windows, OnDraw členské funkce pro ovládací prvek by měl 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);
}
DoSuperclassPaint Členské funkce implementované COleControl, používá proceduru okna Windows ovládacího prvku nakreslete ovládací prvek v rámci zadané zařízení uvnitř ohraničovacího rámečku.Proto ovládací prvek viditelný i v případě, že není aktivní.
[!POZNÁMKA]
DoSuperclassPaint Členské funkce pracovat pouze se tyto typy ovládacích prvků, které umožňují kontext zařízení mají být předány jako wParam o WM_PAINT zprávy.Jedná se o některých standardních ovládacích prvků systému Windows, jako například POSUVNÍK a tlačítkoa běžné ovládací prvky.Pro ovládací prvky, které nepodporují toto chování je nutné poskytnout vlastní kód správně zobrazit ovládací prvek neaktivní.
Zpracování projeví okno zprávy
Ovládací prvky systému Windows obvykle odesílají určité okno zprávy do jejich nadřazené okno.Některé z těchto zpráv, jako je například WM_COMMAND, poskytovat oznámení akce uživatelem.Jiné, jako například WM_CTLCOLOR, slouží k získání informací z nadřazené okno.Ovládací prvek ActiveX obvykle komunikuje s nadřazené okno jinými prostředky.Oznámení předává vyvolává události (zasílání oznámení o událostech) a přístupem k vlastnosti prostředí kontejneru je získat informace o ovládací prvek kontejner.Vzhledem k tomu, že existují tyto techniky komunikace, kontejnerech ovládacího prvku ActiveX neočekává zpracovat všechny okna zprávy odeslané pomocí ovládacího prvku.
Kontejner zabránit přijímání okno zprávy odeslané subclassed Windows ovládací prvek, COleControl vytvoří okno navíc sloužit jako nadřazeného ovládacího prvku.Toto okno navíc, nazvané "odrazka", je vytvořen pouze pro ovládací prvek ActiveX, aby podtříd Windows řízení a má stejnou velikost a umístění okna ovládacího prvku.Okno odrážeč zachycuje některé okno zprávy a odešle zpět ovládacího prvku.Ovládací prvek okno procedury, pak můžete zpracovat tyto zrcadlené zprávy pomocí akcí vhodných pro ovládací prvek ActiveX (například při aktivaci události).Viz Projeví ID zprávy okna seznam oken zachycené zprávy a jejich odpovídající odrazí zprávy.
Kontejner ovládacího prvku technologie ActiveX mohou být navrženy provádět zpráva reflexe, sám, což eliminuje potřebu COleControl k vytvoření okna odrážeč a zkrácení doby spouštění režie pro ovládací prvky subclassed Windows.COleControlzjistí, zda tuto funkci podporuje kontejneru kontrolou okolí vlastnosti s hodnotou MessageReflect TRUE.
Popisovač okna zrcadlených zprávy, přidejte položku pro mapování řídicí zpráva a implementovat obslužné rutiny.Protože zrcadlené zprávy nejsou součástí standardní soubor zpráv definovaných v systému Windows, zobrazení tříd nepodporuje přidávání těchto obslužné rutiny zpráv.Není však těžké ručně přidat obslužnou rutinu.
Chcete-li přidat popisovač zprávy okna zrcadlených zprávy ručně postupujte takto:
Ve třídě ovládacího prvku.H souboru deklaraci obslužné rutiny.Funkce by měl mít návratový typ LRESULT a dva parametry, typy WPARAM a LPARAM, respektive.Příklad:
class CMyAxSubCtrl : public COleControl { ... protected: LRESULT OnOcmCommand(WPARAM wParam, LPARAM lParam); };
Ve třídě ovládacího prvku.CPP soubor, přidejte ON_MESSAGE vstup na mapu zpráv.Parametry této položky by měly být identifikátor zprávy a název funkce obslužné rutiny.Příklad:
BEGIN_MESSAGE_MAP(CMyAxSubCtrl, COleControl) ON_MESSAGE(OCM_COMMAND, &CMyAxSubCtrl::OnOcmCommand) END_MESSAGE_MAP()
Také v.CPP soubor implementovat OnOcmCommand členské funkce pro zpracování zrcadlené zprávy.WParam a lParam parametry jsou stejné jako původní okno zprávy.
Pro příklad toho, jak se projeví zpracování zpráv, předložit vzorek ovládací prvky MFC ActiveX tlačítko.Ukazuje, OnOcmCommand obslužnou rutinu, která zjistí BN_CLICKED kód oznámení a reaguje tak, že pálení událost Click (odeslání).