MFC – ovládací prvky ActiveX: Pokročilá témata
Tento článek popisuje upřesňující témata týkající se vytváření ovládacích prvků ActiveX.Patří sem:
Použití databázových tříd v ovládacích prvcích ActiveX
Provádění parametrizované vlastnosti
Zpracování chyb v ovládacího prvku technologie ActiveX
Zpracování speciálních kláves v ovládacím prvku
Přístup k dialogové okno Ovládací prvky, které jsou neviditelné za běhu
Použití databázových tříd v ovládacích prvcích ActiveX
Protože třídy ovládacího prvku 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í aplikace knihovny MFC pro vývoj ovládacích prvků ActiveX, které používají databázové třídy knihovny MFC.
Obecný přehled třídy databáze knihovny MFC naleznete v tématu Třídami databází MFC (rozhraní DAO a rozhraní ODBC).Článek představuje tříd knihovny MFC rozhraní ODBC a tříd knihovny MFC rozhraní DAO a vás přesměruje na některé další podrobnosti.
[!POZNÁMKA]
Tak jako jazyk Visual C++ .NET, tak taky prostředí a průvodci jazyka Visual C++ nepodporují rozhraní DAO (přestože třídy rozhraní DAO jsou zahrnuty a lze je stále použít).Společnost Microsoft doporučuje používat Šablon technologie OLE DB nebo rozhraní ODBC a knihovna MFC pro nové projekty.Měli by jste používat pouze rozhraní DAO pro údržbu existujících aplikací.
Provádění parametrizované vlastnosti
Parametrizované vlastnosti (někdy nazývané vlastnosti pole) je metoda pro vystavení homogenní kolekci hodnot za jedinou vlastnost ovládacího prvku.Například můžete použít parametrizované vlastnosti pole nebo slovník jako vlastnost zpřístupnit.Tato vlastnost v jazyce Visual Basic se přistupuje pomocí matice notace:
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 provádět parametrické vlastnosti.Průvodce přidáním vlastnosti implementuje vlastnosti přidáním pár Get a Set funkce, které umožňují řízení přístupu uživatele k vlastnosti pomocí výše uvedeného zápisu nebo standardním způsobem.
Podobné metody a vlastnosti, parametry mají také limit na počet parametrů, které jsou povoleny.V případě parametrizované vlastnosti je limit 15 parametrů (s jedním parametrem vyhrazen pro uložení hodnoty vlastnosti).
Následující procedura přidá parametrizované vlastnosti, názvem pole, které lze přistupovat jako dvourozměrné pole celých čísel.
Chcete-li přidat parametry vlastnosti pomocí Průvodce přidáním vlastnosti
Načtěte projektu ovládacího prvku.
V zobrazení tříd rozbalte uzel knihovny ovládacího prvku.
Klepněte pravým tlačítkem na uzel rozhraní pro ovládací prvek (druhý uzel uzlu knihovny) a místní nabídce.
V místní nabídce klepněte na příkaz Přidat a potom klepněte na tlačítko Přidat vlastnost.
V Název vlastnosti zadejte Array.
V Vlastnost typu vyberte Krátký.
Pro provedení typu, klepněte na tlačítko Metody Get/Set.
V Funkce získat a Nastavení funkce políček zadejte jedinečné názvy pro Get a Set funkce a přijměte výchozí názvy.
Přidat parametr nazývá row (typ short), použití Název parametru a Typ parametru prvky.
Přidat druhý parametr nazývá column (typ short).
Klepněte na tlačítko Dokončit.
Změny provedené Průvodce přidáním vlastnosti
Po přidání vlastních vlastností, Průvodce přidáním vlastnosti změní záhlaví třídy control (.H) a provedení (.Soubory CPP).
Následující řádky jsou přidány do třídy ovládacího prvku.H souboru:
SHORT GetArray(SHORT row, SHORT column);
void SetArray(SHORT row, SHORT column, SHORT newVal);
Tento kód deklaruje dvě funkce nazývá GetArray a SetArray umožňující uživateli požadovat určitých řádků a sloupců při přístupu k vlastnosti.
Navíc Add Property Wizard přidá do mapy odesílaní ovládací prvek, umístěn v implementaci třídy ovládacího prvku následující řádky (.Soubor CPP):
DISP_PROPERTY_PARAM_ID(CMyAxUICtrl, "Array", dispidArray, GetArray, SetArray, VT_I2, VTS_I2 VTS_I2)
Nakonec implementace GetArray a SetArray funkce jsou přidány na konec.Soubor CPP.Ve většině případů budete upravovat funkce Get a vrátí hodnotu vlastnosti.Funkce Set zpravidla obsahují kód, který má být spuštěn před nebo po změně vlastností.
Pro tuto vlastnost využít, může deklarovat dvojrozměrné členské proměnné ve třídě ovládacího prvku typu Krátký, k uložení hodnot pro vlastnost parametry.Může změnit funkci Get pro vrácení hodnoty uložené na odpovídající řádek a sloupec, podle parametrů a změnit nastavení funkce Aktualizovat hodnotu odkazuje parametry řádku a sloupce.
Zpracování chyb v ovládacího prvku technologie ActiveX
Pokud dojde k chybové podmínky v ovládacím prvku, musíte zaslat zprávu o chybě do ovládacího prvku kontejneru.Existují dvě metody pro oznamování chyb v závislosti na situaci, kdy dojde k chybě.Pokud k chybě dojde v rámci na vlastnost získat nebo nastavit funkci, nebo v rámci provádění metodu automatizace OLE ovládacího prvku by měl zavolat COleControl::ThrowError, signály, které ovládací prvek uživatele, že došlo k chybě.Pokud dojde k chybě v jiné době, by měl zavolat ovládací prvek COleControl::FireError, která je uložená chybová událost.
Označující typ chyby, ke které došlo, musí projít ovládací prvek kód chyby na ThrowError nebo FireError.Kód chyby je stavový kód OLE, který má hodnotu 32-bit.Pokud je to možné, zvolte kód chyby ze standardní sady kódů stanovených OLECTL.H souboru hlaviček.Následující tabulka shrnuje tyto kódy.
Kódy chyb pro ovládací prvek 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 |
Mimo rozsah řetězce |
CTL_E_OUTOFSTACKSPACE |
Nedostatek místa v zásobníku |
CTL_E_BADFILENAMEORNUMBER |
Chybný název souboru nebo číslo |
CTL_E_FILENOTFOUND |
Soubor nebyl nalezen. |
CTL_E_BADFILEMODE |
Chybný režim souboru |
CTL_E_FILEALREADYOPEN |
Soubor je již otevřen |
CTL_E_DEVICEIOERROR |
Chyba zařízení I/O |
CTL_E_FILEALREADYEXISTS |
Soubor již existuje. |
CTL_E_BADRECORDLENGTH |
Chybná délka záznamu |
CTL_E_DISKFULL |
Disk je plný |
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í byla odepřena |
CTL_E_DISKNOTREADY |
Disk není připraven |
CTL_E_PATHFILEACCESSERROR |
Chyba přístupu k cestě/souboru |
CTL_E_PATHNOTFOUND |
Cesta nebyla nalezena. |
CTL_E_INVALIDPATTERNSTRING |
Neplatný řetězec vzorku |
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 |
Set není podporována při běhu |
CTL_E_SETNOTSUPPORTED |
Metoda Set není podporována (vlastnost jen pro čtení) |
CTL_E_NEEDPROPERTYARRAYINDEX |
Třeba index pole vlastností |
CTL_E_SETNOTPERMITTED |
Metoda Set není povolena |
CTL_E_GETNOTSUPPORTEDATRUNTIME |
Metoda Get není podporována při běhu |
CTL_E_GETNOTSUPPORTED |
Není podporován (jen pro zápis vlastnost) |
CTL_E_PROPERTYNOTFOUND |
Vlastnost nebyla nalezena. |
CTL_E_INVALIDCLIPBOARDFORMAT |
Neplatný formát schránky |
CTL_E_INVALIDPICTURE |
Neplatný obrázek |
CTL_E_PRINTERERROR |
Chyba tiskárny |
CTL_E_CANTSAVEFILETOTEMP |
Soubor nelze uložit na TEMP |
CTL_E_SEARCHTEXTNOTFOUND |
Hledaný text nebyl nalezen. |
CTL_E_REPLACEMENTSTOOLONG |
Příliš dlouhá nahrazení |
V případě potřeby použít CUSTOM_CTL_SCODE makro definovat vlastní chybový kód pro podmínky, které nejsou zahrnuty ve standardních kódů.Parametr pro toto makro by mělo 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 ActiveX nahraďte existující ovládací prvek VBX, definujte ActiveX chybové kódy řízení s stejné číselné hodnoty, které používá ovládací prvek VBX na zajištění souladu kódy chyb.
Zpracování speciálních kláves v ovládacím prvku
V některých případech můžete chtít zpracovat určité kombinace kláves zvláštním způsobem; například vložit nový řádek při stisknutí klávesy ENTER v víceřádkové textové pole ovládací prvek nebo přechod mezi skupinu úpravy řídí při směru ID stisknutí kláves.
Je-li základní třídy ovládacího prvku ActiveX COleControl, můžete přepsat CWnd::PreTranslateMessage zpracovat zprávy před zpracuje kontejneru.Při použití této techniky, vždy vrátí TRUE -li zpracovat zprávu ve vaší přepsané z PreTranslateMessage.
Následující příklad kódu ukazuje možný způsob zpracování zpráv, které souvisejí s klíči směrové.
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í klávesnice rozhraní ovládacího prvku ActiveX naleznete v dokumentaci ActiveX SDK.
Přístup k dialogové okno Ovládací prvky, které jsou neviditelné za běhu
Můžete vytvořit dialogové okno Ovládací prvky, které mají žádné uživatelské rozhraní a neviditelný v době běhu.Pokud přidáte skrytý za běhu ovládací prvek ActiveX na dialogové okno a použití CWnd::GetDlgItem pro přístup k ovládacímu prvku, ovládací prvek nebude pracovat správně.Místo toho používejte jednu z následujících metod k získání objektu, který představuje ovládací prvek:
Pomocí Průvodce přidáním členské proměnné, vyberte Proměnné ovládacího prvku a potom vyberte ID ovládacího prvku.Zadejte název proměnné členů a vyberte obálkovou třídu ovládacího prvku, jako Typ ovládacího prvku.
-nebo-
Deklarujte místní proměnné a podtřídy jako položku dialogové okno.Vložit kód, který se podobá následující (CMyCtrl je obálkovou třídu IDC_MYCTRL1 je ID ovládacího prvku):
CCirc myCirc; myCirc.SubclassDlgItem(IDC_CIRCCTRL2, this); // ... use myCirc ... myCirc.UnsubclassWindow();