Sdílet prostřednictvím


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

  1. Načtěte projektu ovládacího prvku.

  2. V zobrazení tříd rozbalte uzel knihovny ovládacího prvku.

  3. Klepněte pravým tlačítkem na uzel rozhraní pro ovládací prvek (druhý uzel uzlu knihovny) a místní nabídce.

  4. V místní nabídce klepněte na příkaz Přidat a potom klepněte na tlačítko Přidat vlastnost.

  5. V Název vlastnosti zadejte Array.

  6. V Vlastnost typu vyberte Krátký.

  7. Pro provedení typu, klepněte na tlačítko Metody Get/Set.

  8. 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.

  9. Přidat parametr nazývá row (typ short), použití Název parametru a Typ parametru prvky.

  10. Přidat druhý parametr nazývá column (typ short).

  11. 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();
    

Viz také

Koncepty

MFC – ovládací prvky ActiveX