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ů technologie ActiveX. Tady jsou některé z nich:

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

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

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

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

  4. V místní nabídce klepněte na tlačítko Přidat a potom klepněte na tlačítko 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 tlačítko 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ů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 ThrowErrorFireError. 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 COleControlzá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();
    

Viz také

MFC – ovládací prvky ActiveX