MFC – ovládací prvky ActiveX: Pokročilá témata
Tento článek se zabývá pokročilými tématy souvisejícími s vývojem ovládacích prvků technologie ActiveX. Tady jsou některé z nich:
Použití databázových tříd v ovládacích prvcích technologie ActiveX
Přístup k ovládacím prvkům dialogového okna, které jsou neviditelné za běhu
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.
Použití databázových tříd v ovládacích prvcích technologie ActiveX
Protože technologie ActiveX třídy ovládacích prvků 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 technologie ActiveX ovládacích prvků, 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.
Přidání parametrizované vlastnosti pomocí Průvodce přidáním vlastnosti
Načtěte projekt ovládacího prvku.
V zobrazení tříd rozbalte uzel knihovny ovládacího prvku.
Kliknutím pravým tlačítkem myši na uzel rozhraní ovládacího prvku (druhý uzel uzlu knihovny) otevřete místní nabídku.
V místní nabídce klepněte na tlačítko Přidat a potom klepněte na tlačítko Přidat vlastnost.
Do pole Název vlastnosti zadejte
Array
.V poli Typ vlastnosti vyberte
short
.Pro typ implementace klepněte na tlačítko 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ůvodce přidáním vlastnosti
Když přidáte vlastní vlastnost, Průvodce přidáním vlastnosti provede změny v záhlaví třídy ovládacího prvku (. H) a implementace (. CPP) soubory.
Následující řádky jsou přidány do třídy ovládacího prvku . H soubor:
SHORT GetArray(SHORT row, SHORT column);
void SetArray(SHORT row, SHORT column, SHORT newVal);
Tento kód deklaruje dvě volané GetArray
funkce, SetArray
které uživateli umožňují požádat o konkrétní řádek a sloupec při přístupu k vlastnosti.
Kromě toho Průvodce přidáním vlastnosti přidá následující řádky do mapy dispečer ovládacího prvku umístěné v implementaci třídy ovládacího prvku (. CPP) soubor:
DISP_PROPERTY_PARAM_ID(CMyAxUICtrl, "Array", dispidArray, GetArray, SetArray, VT_I2, VTS_I2 VTS_I2)
Nakonec se na konec funkce přidají implementace GetArray
funkcí SetArray
. CPP soubor. 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 technologie 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 kdykoli jindy, ovládací prvek by měl volat COleControl::FireError, který aktivuje akci chybu.
Chcete-li označit druh chyby, ke které došlo, musí ovládací prvek předat kód chyby nebo ThrowError
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 hodnotě OLECTL. Soubor záhlaví H. Následující tabulka shrnuje tyto kódy.
Kódy chyb ovládacích prvků technologie ActiveX
Chyba | Popis |
---|---|
CTL_E_ILLEGALFUNCTIONCALL | Neplatné volání funkce |
CTL_E_OVERFLOW | Přetečení |
CTL_E_OUTOFMEMORY | Nedostatek paměti |
CTL_E_DIVISIONBYZERO | Dělení nulou |
CTL_E_OUTOFSTRINGSPACE | Nedostatek místa pro řetězec |
CTL_E_OUTOFSTACKSPACE | Nedostatek místa v zásobníku |
CTL_E_BADFILENAMEORNUMBER | Chybný název souboru nebo číslo |
CTL_E_FILENOTFOUND | Soubor nenalezen |
CTL_E_BADFILEMODE | Chybný režim souboru |
CTL_E_FILEALREADYOPEN | Soubor již je otevřen. |
CTL_E_DEVICEIOERROR | Vstupně-výstupní chyba zařízení |
CTL_E_FILEALREADYEXISTS | 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_DEVICEUNAVAILABLE | Zařízení není k dispozici |
CTL_E_PERMISSIONDENIED | Oprávnění se zamítlo |
CTL_E_DISKNOTREADY | Disk není připravený |
CTL_E_PATHFILEACCESSERROR | Chyba přístupu k cestě nebo souboru |
CTL_E_PATHNOTFOUND | Cesta nebyla nalezena. |
CTL_E_INVALIDPATTERNSTRING | Neplatný řetězec vzoru |
CTL_E_INVALIDUSEOFNULL | Neplatné použití hodnoty NULL |
CTL_E_INVALIDFILEFORMAT | Neplatný formát souboru |
CTL_E_INVALIDPROPERTYVALUE | Neplatná hodnota vlastnosti |
CTL_E_INVALIDPROPERTYARRAYINDEX | Neplatný index pole vlastností |
CTL_E_SETNOTSUPPORTEDATRUNTIME | Nastavení nepodporováno za běhu |
CTL_E_SETNOTSUPPORTED | Nastavení není podporováno (vlastnost jen pro čtení) |
CTL_E_NEEDPROPERTYARRAYINDEX | Je vyžadován index pole vlastností. |
CTL_E_SETNOTPERMITTED | Nastavit nepovolené |
CTL_E_GETNOTSUPPORTEDATRUNTIME | Získání nepodporováno za běhu |
CTL_E_GETNOTSUPPORTED | Získání nepodporované (vlastnost jen pro zápis) |
CTL_E_PROPERTYNOTFOUND | Vlastnost nebyla nalezena. |
CTL_E_INVALIDCsada LIP BOARDFORMAT | Neplatný formát schránky |
CTL_E_INVALIDPICTURE | Neplatný obrázek |
CTL_E_PRINTERERROR | Chyba tiskárny |
CTL_E_CANTSAVEFILETOTEMP | Soubor nejde uložit do tempu |
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ě. Příklad:
#define MYCTL_E_SPECIALERROR CUSTOM_CTL_SCODE(1000)
Pokud vytváříte ovládací prvek technologie ActiveX pro nahrazení existujícího ovládacího prvku VBX, definujte kódy chyb technologie 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 COleControl
základní třída vašeho technologie ActiveX ovládacího prvku , můžete přepsat CWnd::P reTranslateMessage pro zpracování zpráv předtím, než je kontejner zpracuje. Při použití této techniky vždy vrátit hodnotu TRUE , pokud zpracováváte zprávu v 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 technologie ActiveX najdete v dokumentaci technologie 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ý v době běhu technologie ActiveX ovládací prvek do dialogového okna a použijete CWnd::GetDlgItem pro přístup k ovládacímu 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();