Udostępnij za pośrednictwem


Formanty MFC ActiveX: tematy zaawansowane

Ten artykuł obejmuje zaawansowanych tematach związanych z rozwojem formantów ActiveX.Obejmują one:

  • Korzystanie z klas bazy danych w formantach ActiveX

  • Wykonywania sparametryzowana właściwość

  • Obsługa błędów w formantów ActiveX

  • Obsługiwanie specjalnych klawiszy w formancie

  • Uzyskiwanie dostępu do formanty okna dialogowego, które są niewidoczne w czasie wykonywania

Korzystanie z klas bazy danych w formantach ActiveX

Ponieważ klasy formantu ActiveX są częścią biblioteki klas, można zastosować samej procedury i zasady korzystania z klasami baz danych w standardowych aplikacji MFC projektowania formantów ActiveX, które używają klasami baz danych MFC.

Aby uzyskać ogólny przegląd klasami baz danych MFC, zobacz Klasami baz danych MFC (DAO i ODBC).Artukuł klas MFC ODBC i klasy MFC DAO i kieruje użytkownika do więcej szczegółów na obu.

[!UWAGA]

Począwszy od programu Visual C++ .NET środowiska Visual C++ i kreatorów już obsługiwać DAO (choć znajdują się klasy DAO i nadal można używać).Firma Microsoft zaleca użycie Szablonów OLE DB lub ODBC i MFC dla nowych projektów.W utrzymaniu istniejących aplikacji należy używać tylko obiektów DAO.

Wykonywania sparametryzowana właściwość

Właściwość sparametryzowana (czasami nazywany tablicy właściwości) jest metodą narażając jednorodnych zbiór wartości jako pojedynczej właściwości formantu.Na przykład właociwooć sparametryzowana narazić tablica lub w słowniku jako właściwość.W języku Visual Basic taka właściwość jest dostępny przy użyciu notacji tablicy:

x = o.Array(2, 3) ' gets element of 2D array
o.Array(2, 3) = 7 ' sets element of 2D array

Kreator dodawania właściwości umożliwia sparametryzowana właściwość.Kreator dodawania właściwości implementuje właściwość dodając parę funkcje Get/Set, które pozwalają użytkownikowi kontroli dostępu do właściwości przy użyciu notacji powyżej lub w sposób standardowy.

Podobne do metod i właściwości, właściwości parametryczne mają również maksymalną dozwoloną liczbę parametrów.W przypadku właściwości sparametryzowana limit wynosi 15 parametry (z jednym parametrem zarezerwowanego na przechowywanie wartości właściwości).

Poniższa procedura dodaje właściwość sparametryzowana, o nazwie tablicy, które mogą być dostępne jako dwuwymiarowej tablicy liczb całkowitych.

Aby dodać właściwość sparametryzowana przy użyciu Kreatora dodawania właściwości

  1. Załaduj projekt z kontroli.

  2. W widoku klasy rozwiń węzeł Biblioteka pilota.

  3. Kliknij prawym przyciskiem myszy węzeł interfejsu kontrolnej (drugiego węzła węzeł biblioteki), aby otworzyć menu skrótów.

  4. W menu skrótów kliknij polecenie Dodaj i kliknij przycisk Dodaj właściwość.

  5. W Nazwa właściwości wpisz Array.

  6. W Typ właściwości wybierz opcję Krótki.

  7. Dla realizacji typu, kliknij przycisk Metody Get i Set.

  8. W Uzyskać funkcji i Zestaw funkcji pola, wpisz unikatowe nazwy dla Get i zestaw funkcji lub zaakceptować nazwy domyślne.

  9. Dodać parametr o nazwie row (typ short), z wykorzystaniem Nazwa parametru i Typ parametru kontroli.

  10. Dodaj drugi parametr o nazwie column (typ short).

  11. Kliknij Zakończ.

Zmiany wprowadzone przez właściwość Kreator dodawania

Podczas dodawania właściwości niestandardowej, Kreator dodawania właściwości wprowadza zmiany do nagłówka kontroli klasy (.H) i wykonania (.Pliki CPP).

Następujące wiersze są dodawane do klasy kontroli.Plik H:

SHORT GetArray(SHORT row, SHORT column);
void SetArray(SHORT row, SHORT column, SHORT newVal);

Ten kod deklaruje dwie funkcje o nazwie GetArray i SetArray , które pozwalają użytkownikowi na żądania określonego wiersza i kolumny, gdy dostęp do właściwości.

Ponadto Kreator dodawania właściwości dodaje następujące wiersze do formantu mapy wysyłki, znajdujące się w implementacji klasy formantu (.Plik CPP):

DISP_PROPERTY_PARAM_ID(CMyAxUICtrl, "Array", dispidArray, GetArray, SetArray, VT_I2, VTS_I2 VTS_I2)

Wreszcie, implementacje GetArray i SetArray funkcje są dodawane na końcu.Plik CPP.W większości przypadków użytkownik zmodyfikuje funkcji Get zwraca wartość właściwości.Funkcja zestawu będzie zazwyczaj zawierać kod, który należy wykonać przed lub po wprowadzeniu zmian właściwości.

Dla tej właściwości, aby być przydatne, może zadeklarować zmienną dwuwymiarowej tablicy w klasie formantu typu Krótki, do przechowywania wartości parametryczne właściwości.Można następnie zmodyfikować funkcji Get zwraca wartość przechowywane w właściwego wierszy i kolumn, co wynika z parametrów i modyfikowanie funkcja zestaw aktualizacji wartości odwołuje się parametry wiersza i kolumny.

Obsługa błędów w formantów ActiveX

Jeśli występują błędy w formancie, może być konieczne zgłosić błąd do formantu kontenera.Istnieją dwie metody zgłaszania błędów, w zależności od sytuacji, w której występuje błąd.Jeśli błąd występuje w ramach majątku uzyskać lub zestaw funkcji, lub w celu wykonania metoda automatyzacji OLE, powinna wywołać formantu COleControl::ThrowError, których sygnały użytkownikom kontroli, że wystąpił błąd.Jeśli błąd występuje w dowolnym momencie, formantu powinna wywołać COleControl::FireError, która wyzwala pień zdarzenie błędu.

Aby wskazać rodzaj błędu, który wystąpił, formant musi przejść kod błędu do ThrowError lub FireError.Kod błędu jest kod stanu OLE, który ma wartość 32-bitowych.Jeśli to możliwe, należy wybrać kod błędu od standardowego zestawu kodów zdefiniowanych w OLECTL.H nagłówka pliku.Poniższa tabela zawiera podsumowanie tych kodów.

Kody błędów formantu ActiveX

Błąd

Opis

CTL_E_ILLEGALFUNCTIONCALL

Niedozwolone wywołanie funkcji

CTL_E_OVERFLOW

Przepełnienie

CTL_E_OUTOFMEMORY

Za mało pamięci

CTL_E_DIVISIONBYZERO

Dzielenie przez zero

CTL_E_OUTOFSTRINGSPACE

Brak miejsca na ciąg

CTL_E_OUTOFSTACKSPACE

Brak miejsca na stosie

CTL_E_BADFILENAMEORNUMBER

Nieprawidłowa nazwa pliku lub numer

CTL_E_FILENOTFOUND

Nie można odnaleźć pliku

CTL_E_BADFILEMODE

Niewłaściwy tryb otwarcia pliku

CTL_E_FILEALREADYOPEN

Plik jest już otwarty

CTL_E_DEVICEIOERROR

Błąd urządzenia We/Wy

CTL_E_FILEALREADYEXISTS

Plik już istnieje.

CTL_E_BADRECORDLENGTH

Nieprawidłowa długość rekordu

CTL_E_DISKFULL

Dysk jest zapełniony

CTL_E_BADRECORDNUMBER

Zły numer rekordu

CTL_E_BADFILENAME

Nieprawidłowa nazwa pliku

CTL_E_TOOMANYFILES

Zbyt wiele plików

CTL_E_DEVICEUNAVAILABLE

Urządzenie niedostępne

CTL_E_PERMISSIONDENIED

Odmowa uprawnień

CTL_E_DISKNOTREADY

Dysk nie jest gotowy

CTL_E_PATHFILEACCESSERROR

Błąd dostępu do ścieżki/pliku

CTL_E_PATHNOTFOUND

Nie można odnaleźć ścieżki

CTL_E_INVALIDPATTERNSTRING

Nieprawidłowy ciąg znaków wzorca

CTL_E_INVALIDUSEOFNULL

Nieprawidłowe użycie NULL

CTL_E_INVALIDFILEFORMAT

Nieprawidłowy format pliku

CTL_E_INVALIDPROPERTYVALUE

Nieprawidłowa wartość właściwości

CTL_E_INVALIDPROPERTYARRAYINDEX

Nieprawidłowy indeks tablicy właściwości

CTL_E_SETNOTSUPPORTEDATRUNTIME

Zestaw nie jest obsługiwane w czasie wykonywania

CTL_E_SETNOTSUPPORTED

Set nie jest możliwa (właściwość tylko do odczytu)

CTL_E_NEEDPROPERTYARRAYINDEX

Potrzebny indeks tablicy właściwości

CTL_E_SETNOTPERMITTED

Set nie jest możliwa

CTL_E_GETNOTSUPPORTEDATRUNTIME

Get nie jest możliwa w czasie wykonywania

CTL_E_GETNOTSUPPORTED

Nie jest obsługiwany (tylko do zapisu pobrać właściwości)

CTL_E_PROPERTYNOTFOUND

Nie znaleziono właściwości

CTL_E_INVALIDCLIPBOARDFORMAT

Nieprawidłowy format Schowka

CTL_E_INVALIDPICTURE

Nieprawidłowy obraz

CTL_E_PRINTERERROR

Błąd drukarki

CTL_E_CANTSAVEFILETOTEMP

Nie można zapisać pliku Temp

CTL_E_SEARCHTEXTNOTFOUND

Nie można odnaleźć tekstu wyszukiwania

CTL_E_REPLACEMENTSTOOLONG

Zbyt długie elementy zastępujące

Jeśli to konieczne, użyj CUSTOM_CTL_SCODE makro, aby zdefiniować kod błędu niestandardowego dla warunku, który nie jest objęty przez jedną ze standardowych kodów.Parametru dla tego makra powinna być liczbą całkowitą między 1000 a 32767 włącznie.Na przykład:

#define MYCTL_E_SPECIALERROR CUSTOM_CTL_SCODE(1000)

Jeśli tworzysz formant ActiveX, aby zastąpić istniejący formant VBX, należy zdefiniować kody błędów formantu ActiveX, tak o tych samych wartościach liczbowych, formant VBX używa się do zapewnienia, że kody błędów są zgodne.

Obsługiwanie specjalnych klawiszy w formancie

W niektórych przypadkach może zaistnieć do obsługi niektórych kombinacji klawiszy w szczególny sposób; na przykład, Wstaw nowy wiersz po naciśnięciu klawisza ENTER w tekście wielowierszowym polu formantu lub przenieść między grupą Edycja steruje, gdy kierunkowe wciśnięty Identyfikatora klucza.

Jeśli jest klasą bazową dla formantu ActiveX COleControl, można zastąpić CWnd::PreTranslateMessage do obsługi wiadomości, zanim kontenera przetwarza je.Korzystając z tej techniki, zawsze zwracają TRUE Jeśli obsługi wiadomości w sieci zastępująca PreTranslateMessage.

Poniższy przykład kodu pokazuje możliwy sposób obsługi komunikatów dotyczących klawiszy kierunkowych.

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;
}

Aby uzyskać więcej informacji dotyczących obsługi klawiatury interfejsów dla formantu ActiveX zobacz dokumentację zestawu SDK ActiveX.

Uzyskiwanie dostępu do formanty okna dialogowego, które są niewidoczne w czasie wykonywania

Można tworzyć formanty okna dialogowego, które bez interfejsu użytkownika i są niewidoczne w czasie wykonywania.Jeśli dodasz niewidoczny w czasie wykonywania formantu ActiveX okno dialogowe i użytkowania CWnd::GetDlgItem uzyskać dostęp do formantu, formant nie będzie poprawnie działać.Zamiast tego warto z nich korzystać z poniższych technik Aby uzyskać obiekt, który reprezentuje formantu:

  • Za pomocą Członkowskie zmiennej Kreatora dodawania, zaznacz Kontroli zmiennej , a następnie wybierz identyfikator formantu.Wprowadź nazwę zmiennej składnika i wybierz klasy otoki formantu jako Typ formantu.

    -lub-

  • Zadeklarować zmienną lokalną i podklasy jako element okno dialogowe.Wstawianie kodu, podobny do następującego (CMyCtrl klasy otoki jest IDC_MYCTRL1 jest identyfikator formantu):

    CCirc myCirc;
    myCirc.SubclassDlgItem(IDC_CIRCCTRL2, this);
    // ... use myCirc ...
    myCirc.UnsubclassWindow();
    

Zobacz też

Koncepcje

Formanty MFC ActiveX