Formantów MFC ActiveX: Tematy zaawansowane
W tym artykule omówiono zagadnienia zaawansowane związanych z rozwojem formantów ActiveX.Obejmują one:
Korzystanie z klas bazy danych w formantach ActiveX
Właściwość sparametryzowana wykonawczych
Obsługa błędów w formantu ActiveX
Obsługa klawiszy specjalnych w formancie
Uzyskiwanie dostępu do formantów 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ć tej samej procedury i zasady używania klas bazy danych w standardowych aplikacji MFC do rozwijania formantów ActiveX, które używać klasy MFC bazy danych.
Ogólny przegląd klas MFC bazy danych, zobacz Klasami baz danych MFC (DAO i ODBC).Artykuł wprowadza klas MFC ODBC i MFC DAO klasy i kieruje użytkownika do więcej szczegółów na temat albo.
[!UWAGA]
W Visual C++.NET, środowiska Visual C++ i kreatorzy już obsługiwać DAO (chociaż klasy DAO są włączone i nadal można ich użyć).Firma Microsoft zaleca użycie Szablonów OLE DB lub ODBC i MFC dla nowych projektów.Utrzymania istniejących aplikacji, należy używać tylko obiektów DAO.
Właściwość sparametryzowana wykonawczych
Właściwość sparametryzowana (czasami nazywany tablicy właściwości) jest metodą narażania jednorodnych zbiór wartości jako pojedynczej właściwości formantu.Na przykład można użyć sparametryzowana właściwości narazić tablicy lub w słowniku jako właściwość.W języku Visual Basic takiej właściwości 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
Użyj Kreatora dodawania właściwości, aby zaimplementować sparametryzowana właściwości.Kreator dodawania właściwości implementuje właściwości dodając parę funkcji Get i Set, które umożliwia użytkownikowi kontroli dostępu do właściwości przy użyciu notacji powyżej lub w standardowy sposób.
Podobne do metod i właściwości, właściwości sparametryzowana mają również ograniczenie liczby parametrów dozwolone.W przypadku właściwości sparametryzowana limit jest 15 parametrów (z jeden parametr zarezerwowany do przechowywania wartości właściwości).
Poniższa procedura dodaje sparametryzowana właściwość o nazwie tablicy, do którego dostęp można uzyskać jako dwuwymiarowej tablicy liczb całkowitych.
Aby dodać właściwość sparametryzowana przy użyciu Kreatora dodawania właściwości
Załadować projekt programu kontroli.
W widoku klasy rozwiń węzeł Biblioteka formantu.
Kliknij prawym przyciskiem myszy węzeł interfejsu dla formantu (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 pozycję krótki.
Dla wykonania typu, kliknij Metody Get i Set.
W Uzyskać funkcji i Ustawić funkcję polach wpisz unikatowych nazw dla Get i Set funkcje lub zaakceptować nazwy domyślne.
Dodać parametr o nazwie row (typu short), korzystanie z Nazwa parametru i Typ parametru kontroli.
Dodać drugi parametr o nazwie column (typu short).
Kliknij Zakończ.
Zmiany wprowadzone przez właściwość Kreatora dodawania
Podczas dodawania niestandardowych właściwości Kreatora 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 control.H plik:
SHORT GetArray(SHORT row, SHORT column);
void SetArray(SHORT row, SHORT column, SHORT newVal);
Ten kod deklaruje dwóch funkcji o nazwie GetArray i SetArray który umożliwia użytkownikowi żądanie 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 mapy wysyłki kontroli, 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 zostanie zmodyfikowana funkcja Get zwróci wartość właściwości.Funkcja Set będzie zazwyczaj zawierać kod, który powinien wykonać przed lub po zmianie właściwości.
Dla tej właściwości użyteczne może zadeklarować zmienną dwuwymiarowej tablicy w klasie formantu typu krótki, do przechowywania wartości właściwości sparametryzowanej.Można następnie zmodyfikować zwraca wartość przechowywaną w prawidłowego wiersza i kolumny, jak wskazane przez parametry funkcji Get i modyfikowania funkcji zestawu aktualizacji wartości, odwołuje się parametry wiersza i kolumny.
Obsługa błędów w formantu ActiveX
Jeśli występują błędy w formancie, należy zgłosić błąd w kontenerze kontroli.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 właściwości uzyskać lub ustawić funkcję, lub w ramach realizacji metoda automatyzacji OLE, należy wywoływać formant COleControl::ThrowError, których sygnały użytkownikowi kontroli, że wystąpił błąd.Jeśli błąd występuje w dowolnym momencie, kontroli powinna wywołać COleControl::FireError, który pożary zapasów zdarzenie błędu.
Aby wskazać rodzaj błędu, który wystąpił, formant musi upłynąć kod błędu ThrowError lub FireError.Kod błędu jest kod stanu OLE, której wartość 32-bitowych.Jeśli to możliwe, należy wybrać kod błędu ze standardowego zestawu kodów określonych 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 numeru |
CTL_E_FILENOTFOUND |
Nie można odnaleźć pliku |
CTL_E_BADFILEMODE |
Nieprawidłowy tryb 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 |
Zła długość rekordu |
CTL_E_DISKFULL |
Dysk 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 jest niedostępne |
CTL_E_PERMISSIONDENIED |
Odmowa uprawnień |
CTL_E_DISKNOTREADY |
Dysk nie jest gotowy |
CTL_E_PATHFILEACCESSERROR |
Błąd dostępu do pliku/ścieżki |
CTL_E_PATHNOTFOUND |
Nie znaleziono ścieżki |
CTL_E_INVALIDPATTERNSTRING |
Nieprawidłowy wzorzec ciągu |
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 |
Zestaw nie jest obsługiwane (właściwość tylko do odczytu) |
CTL_E_NEEDPROPERTYARRAYINDEX |
Potrzebny indeks tablicy właściwości |
CTL_E_SETNOTPERMITTED |
Zestaw nie jest dozwolone |
CTL_E_GETNOTSUPPORTEDATRUNTIME |
Get nie obsługiwane w czasie wykonywania |
CTL_E_GETNOTSUPPORTED |
Pobierz nieobsługiwane (właściwość tylko do zapisu) |
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ć plik TEMP |
CTL_E_SEARCHTEXTNOTFOUND |
Nie można odnaleźć wyszukiwania tekstu |
CTL_E_REPLACEMENTSTOOLONG |
Zbyt długie elementy zastępujące |
Jeśli to konieczne, użyj CUSTOM_CTL_SCODE makra, aby zdefiniować kod błędu niestandardowego dla warunku, który nie jest objęte przez jedną ze standardowych kodów.Parametru tego makra powinna być liczbą całkowitą pomiędzy 1000 do 32 767, 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 z wartości numeryczne, które formant VBX używa się do zapewnienia, że kody błędów są zgodne.
Obsługa klawiszy specjalnych w formancie
W niektórych przypadkach można obsługiwać niektórych kombinacji klawiszy w sposób szczególny; na przykład, Wstaw nowy wiersz po naciśnięciu klawisza ENTER w wielowierszowego tekstu formantu pola lub przenosić między grupy Edycja formantów podczas kierunkowe naciśnięto 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 zwraca TRUE Jeśli obsługi wiadomości w sieci zastępująca PreTranslateMessage.
Poniższy przykład kodu pokazuje możliwym sposobem obsługi komunikatów dotyczących klawiszy strzałek.
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 formantów 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.Po dodaniu niewidoczne w czasie działania formantu ActiveX, okno dialogowe i wykorzystania CWnd::GetDlgItem na dostęp do formantu, formant nie będzie działać poprawnie.Zamiast tego należy jednej z następujących technik służy do wyświetlania obiekt reprezentujący kontroli:
Kreatora dodawania Członkowskie zmienną, zaznacz Kontroli zmiennej i zaznacz identyfikator formantu.Wprowadź nazwę zmiennej Członkowskich i wybierz klasy otoki formantu jako Typu formantu.
- lub -
Zadeklarować zmiennej lokalnej i w podklasie jako elementu okna dialogowego.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();