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
Załaduj projekt z kontroli.
W widoku klasy rozwiń węzeł Biblioteka pilota.
Kliknij prawym przyciskiem myszy węzeł interfejsu kontrolnej (drugiego węzła węzeł biblioteki), aby otworzyć menu skrótów.
W menu skrótów kliknij polecenie Dodaj i kliknij przycisk Dodaj właściwość.
W Nazwa właściwości wpisz Array.
W Typ właściwości wybierz opcję Krótki.
Dla realizacji typu, kliknij przycisk Metody Get i Set.
W Uzyskać funkcji i Zestaw funkcji pola, wpisz unikatowe nazwy dla Get i zestaw funkcji lub zaakceptować nazwy domyślne.
Dodać parametr o nazwie row (typ short), z wykorzystaniem Nazwa parametru i Typ parametru kontroli.
Dodaj drugi parametr o nazwie column (typ short).
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();