Poznámka
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Tento článek se zabývá pokročilými tématy souvisejícími s vývojem ovládacích prvků ActiveX. Patří mezi ně:
Důležité
ActiveX je starší technologie, která by se neměla používat pro nový vývoj. Další informace o moderních technologiích, které nahrazují ovládací prvky ActiveX, naleznete v tématu Ovládací prvky ActiveX.
Použití databázových tříd v ovládacích prvcích ActiveX
Protože třídy ovládacích prvků ActiveX jsou součástí knihovny tříd, můžete použít stejné postupy a pravidla pro použití databázových tříd ve standardní aplikaci MFC k vývoji ovládacích prvků ActiveX, které používají databázové třídy MFC.
Obecný přehled databázových tříd MFC najdete v tématu Třídy databáze MFC (DAO a ODBC). Tento článek představuje jak třídy MFC ODBC, tak třídy rozhraní MFC DAO a nasměruje vás na další podrobnosti o obou.
Poznámka:
Rozhraní DAO se podporuje prostřednictvím Office 2013. DAO 3.6 je konečná verze a je považována za za zastaralou. Prostředí a průvodci Visual C++ nepodporují rozhraní DAO (i když jsou zahrnuty třídy DAO a můžete je stále používat). Společnost Microsoft doporučuje pro nové projekty používat šablony OLE DB nebo rozhraní ODBC a MFC . DaO byste měli používat jenom při údržbě existujících aplikací.
Implementace parametrizované vlastnosti
Parametrizovaná vlastnost (někdy označovaná jako pole vlastností) je metoda pro zveřejnění homogenní kolekce hodnot jako jedné vlastnosti ovládacího prvku. Můžete například použít parametrizovanou vlastnost k zveřejnění pole nebo slovníku jako vlastnosti. V jazyce Visual Basic se k takové vlastnosti přistupuje pomocí zápisu pole:
x = o.Array(2, 3) ' gets element of 2D array
o.Array(2, 3) = 7 ' sets element of 2D array
Pomocí Průvodce přidáním vlastnosti implementujte parametrizovanou vlastnost. Průvodce přidáním vlastnosti implementuje vlastnost přidáním dvojice funkcí Get/Set, které ovládacímu uživateli umožňují přístup k vlastnosti pomocí výše uvedeného zápisu nebo standardním způsobem.
Podobně jako metody a vlastnosti mají parametrizované vlastnosti také omezení počtu povolených parametrů. V případě parametrizovaných vlastností je limit 15 parametrů (s jedním parametrem vyhrazeným pro uložení hodnoty vlastnosti).
Následující postup přidá parametrizovanou vlastnost s názvem Array, ke které lze přistupovat jako dvojrozměrné pole celých čísel.
Jak přidat parametrické vlastnosti pomocí Průvodce přidávání vlastností
Načtěte projekt ovládacího prvku.
V zobrazení tříd rozbalte uzel knihovny vašeho ovládacího prvku.
Kliknutím pravým tlačítkem myši na uzel rozhraní pro váš ovládací prvek (druhý z uzlů knihovny) otevřete místní nabídku.
V místní nabídce klepněte na Přidat a potom klepněte na Přidat vlastnost.
Do pole Název vlastnosti zadejte
Array
.V poli Typ vlastnosti vyberte
short
.Pro typ implementace klepněte na get/set metody.
Do polí Získat funkci a Nastavit funkci zadejte jedinečné názvy funkcí Get a Set Functions nebo přijměte výchozí názvy.
Přidejte parametr s názvem řádek ( typ short) pomocí ovládacích prvků Název parametru a Typ parametru .
Přidejte druhý parametr s názvem column (type short).
Klikněte na Finish (Dokončit).
Změny provedené průvodcem pro přidání vlastnosti
Když přidáte uživatelskou vlastnost, Průvodce přidáním vlastnosti provede změny v záhlaví třídy ovládacího prvku (.H) a souborech implementace (.CPP).
Následující řádky jsou přidány do kontrolní třídy .H soubor:
SHORT GetArray(SHORT row, SHORT column);
void SetArray(SHORT row, SHORT column, SHORT newVal);
Tento kód deklaruje dvě funkce nazvané GetArray
a SetArray
, které umožňují uživateli požádat o konkrétní řádek a sloupec při přístupu k vlastnosti.
Průvodce přidáním vlastnosti navíc přidá následující řádky do mapy dispečera ovládacího prvku, která je umístěna v souboru implementace třídy ovládacího prvku (.CPP).
DISP_PROPERTY_PARAM_ID(CMyAxUICtrl, "Array", dispidArray, GetArray, SetArray, VT_I2, VTS_I2 VTS_I2)
Nakonec se implementace funkcí GetArray
a SetArray
přidají na konec .CPP souboru. Ve většině případů upravíte funkci Get tak, aby vracela hodnotu vlastnosti. Funkce Set obvykle obsahuje kód, který by se měl provést, a to buď před nebo po změně vlastnosti.
Aby byla tato vlastnost užitečná, můžete deklarovat dvojrozměrnou proměnnou člena pole ve třídě ovládacího prvku typu short
, uložit hodnoty pro parametrizovanou vlastnost. Potom můžete upravit funkci Get tak, aby vrátila hodnotu uloženou ve správném řádku a sloupci, jak je uvedeno v parametrech, a upravit funkci Set tak, aby aktualizovala hodnotu odkazovanou parametry řádku a sloupce.
Zpracování chyb v ovládacím prvku ActiveX
Pokud v ovládacím prvku dojde k chybám, může být nutné ohlásit chybu kontejneru ovládacího prvku. Existují dvě metody pro hlášení chyb v závislosti na situaci, ve které k chybě dochází. Pokud k chybě dojde v rámci funkce Get nebo Set vlastnosti, nebo v implementaci OLE Automation metoda, by ovládací prvek měl volat COleControl::ThrowError, který signalizuje řídicímu uživateli, že došlo k chybě. Pokud k chybě dojde v kteroukoli jinou dobu, ovládací prvek by měl volat COleControl::FireError, který spustí událost Chyba.
Chcete-li označit druh chyby, ke které došlo, musí ovládací prvek předat kód chyby do ThrowError
nebo FireError
. Kód chyby je stavový kód OLE, který má 32bitovou hodnotu. Pokud je to možné, zvolte kód chyby ze standardní sady kódů definovaných v hlavičkovém souboru OLECTL.H. Následující tabulka shrnuje tyto kódy.
Kódy chyb ovládacích prvků ActiveX
Chyba | Popis |
---|---|
CTL_E_ILLEGALFUNCTIONCALL – Neplatné volání funkce | Neplatné volání funkce |
CTL_E_OVERFLOW | Přetečení |
CTL_E_NEDOSTATEK_PAMĚTI | Nedostatek paměti |
CTL_E_DIVISIONBYZERO | Dělení nulou |
CTL_E_OUTOFSTRINGSPACE | Nedostatek místa na řetězci |
CTL_E_NEDOSTATEK_PROSTORU_PRO_ZÁSOBNÍK | Vyčerpání prostoru zásobníku |
CTL_E_BADFILENAMEORNUMBER | Chybný název souboru nebo číslo |
CTL_E_FILENOTFOUND (Soubor nebyl nalezen) | Soubor nebyl nalezen. |
CTL_E_BADFILEMODE | Chybný režim souboru |
Soubor je již otevřen (CTL_E_FILEALREADYOPEN) | Soubor už je otevřený. |
CTL_E_DEVICEIOERROR | Chyba vstupně-výstupních operací zařízení |
CTL_E_SOUBORUŽEXISTUJE | Soubor již existuje. |
CTL_E_BADRECORDLENGTH | Chybná délka záznamu |
CTL_E_DISKFULL | Plný disk |
CTL_E_BADRECORDNUMBER | Chybné číslo záznamu |
CTL_E_BADFILENAME | Chybný název souboru |
CTL_E_TOOMANYFILES | Příliš mnoho souborů |
CTL_E_ZAŘÍZENÍNENÍKDISPOZICI | Zařízení není k dispozici |
CTL_E_PERMISSIONDENIED (přístup byl odepřen) | Oprávnění byla odepřena. |
CTL_E_DISKNOTREADY (Disk není připraven) | Disk není připravený |
Chyba při přístupu k cestě/souboru - CTL_E_PATHFILEACCESSERROR | Chyba přístupu k cestě nebo souboru |
CTL_E_PATHNOTFOUND | Cesta nebyla nalezena. |
CTL_E_NEPLATNÝŘETĚZECVZORU | Neplatný vzorový řetězec |
Neplatné použití null | Neplatné použití hodnoty NULL |
Neplatný formát souboru | Neplatný formát souboru |
CTL_E_NEPLATNÁHODNOTAVLASTNOSTI | Neplatná hodnota vlastnosti |
CTL_E_INVALIDPROPERTYARRAYINDEX (Neplatný index pole vlastností) | Neplatný index pole vlastností |
CTL_E_SETNOTSUPPORTEDATRUNTIME | Nastavení není podporováno během spuštění |
CTL_E_NastaveníNepodporováno | Nastavení není podporováno (vlastnost jen pro čtení) |
CTL_E_POTŘEBA_INDEXU_POLE_VLASTNOSTI | Potřebujete index pole vlastností. |
CTL_E_SETNOTPERMITTED (Nastavení není povoleno) | Nastavit nepovolené |
CTL_E_GETNOTSUPPORTEDATRUNTIME | Operace není podporována za běhu |
CTL_E_GETNOTSUPPORTED | Nelze číst (vlastnost jen pro zápis) |
CTL_E_PROPERTYNOTFOUND | Vlastnost nebyla nalezena. |
CTL_E_NESPRÁVNÝFORMÁTKLIPBOARDU | Neplatný formát schránky |
CTL_E_INVALIDPICTURE (Neplatný obrázek) | Neplatný obrázek |
CTL_E_PRINTERERROR | Chyba tiskárny |
CTL_E_CANTSAVEFILETOTEMP | Nelze uložit soubor do TEMP |
CTL_E_SEARCHTEXTNOTFOUND | Hledaný text nebyl nalezen. |
CTL_E_REPLACEMENTSTOOLONG | Nahrazení je příliš dlouhé |
V případě potřeby použijte makro CUSTOM_CTL_SCODE k definování vlastního kódu chyby pro podmínku, která není pokryta jedním ze standardních kódů. Parametr tohoto makra by měl být celé číslo od 1000 do 32767 včetně. Například:
#define MYCTL_E_SPECIALERROR CUSTOM_CTL_SCODE(1000)
Pokud vytváříte ovládací prvek ActiveX pro nahrazení existujícího ovládacího prvku VBX, definujte kódy chyb ovládacích prvků ActiveX se stejnými číselnými hodnotami, které ovládací prvek VBX používá k zajištění kompatibility kódů chyb.
Zpracování speciálních kláves v ovládacím prvku
V některých případech můžete chtít zpracovávat určité kombinace stisknutí kláves speciálním způsobem; Například vložte nový řádek, když je klávesa ENTER stisknuta v ovládacím prvku víceřádkového textového pole nebo se pohybuje mezi skupinou ovládacích prvků pro úpravy, když stisknete směrové ID klávesy.
Pokud je základní třída vašeho ovládacího prvku ActiveX COleControl
, můžete přepsat CWnd::PreTranslateMessage, aby zpracovával zprávy předtím, než je kontejner zpracuje. Při použití této techniky vždy vracejte TRUE, pokud zprávu zpracováváte v rámci vaší implementace přepsání PreTranslateMessage
.
Následující příklad kódu ukazuje možný způsob zpracování všech zpráv souvisejících se směrovými klíči.
BOOL CMyAxUICtrl::PreTranslateMessage(MSG* pMsg)
{
BOOL bHandleNow = FALSE;
switch (pMsg->message)
{
case WM_KEYDOWN:
switch (pMsg->wParam)
{
case VK_UP:
case VK_DOWN:
case VK_LEFT:
case VK_RIGHT:
bHandleNow = TRUE;
break;
}
if (bHandleNow)
{
OnKeyDown((UINT)pMsg->wParam, LOWORD(pMsg->lParam), HIWORD(pMsg->lParam));
}
break;
}
return bHandleNow;
}
Další informace o zpracování rozhraní klávesnice pro ovládací prvek ActiveX naleznete v dokumentaci k sadě ActiveX SDK.
Přístup k ovládacím prvkům dialogového okna, které jsou neviditelné za běhu
Můžete vytvořit ovládací prvky dialogového okna, které nemají žádné uživatelské rozhraní a nejsou neviditelné za běhu. Pokud přidáte neviditelný ovládací prvek ActiveX za běhu do dialogového okna a použijete CWnd::GetDlgItem pro přístup k ovládacího prvku, nebude ovládací prvek fungovat správně. Místo toho byste měli použít jednu z následujících technik k získání objektu, který představuje ovládací prvek:
Pomocí Průvodce přidáním členské proměnné vyberte Řídicí proměnnou a pak vyberte ID ovládacího prvku. Zadejte název členské proměnné a jako typ ovládacího prvku vyberte třídu obálky ovládacího prvku.
nebo
Deklarujte místní proměnnou a podtřídu jako položku dialogového okna. Vložte kód podobný následujícímu (
CMyCtrl
je třída obálky, IDC_MYCTRL1 je ID ovládacího prvku):CCirc myCirc; myCirc.SubclassDlgItem(IDC_CIRCCTRL2, this); // ... use myCirc ... myCirc.UnsubclassWindow();