Sdílet prostřednictvím


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ů 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í

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

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

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

  4. V místní nabídce klepněte na Přidat a potom klepněte na Přidat vlastnost.

  5. Do pole Název vlastnosti zadejte Array.

  6. V poli Typ vlastnosti vyberte short.

  7. Pro typ implementace klepněte na get/set metody.

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

  9. Přidejte parametr s názvem řádek ( typ short) pomocí ovládacích prvků Název parametru a Typ parametru .

  10. Přidejte druhý parametr s názvem column (type short).

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

Viz také

MFC – ovládací prvky ActiveX