Uwaga
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
W tym artykule opisano zaawansowane tematy związane z opracowywaniem kontrolek ActiveX. Są to:
Ważne
ActiveX to starsza technologia, która nie powinna być używana do tworzenia nowych rozwiązań. Aby uzyskać więcej informacji na temat nowoczesnych technologii zastępujących activex, zobacz Kontrolki ActiveX.
Używanie klas bazy danych w kontrolkach ActiveX
Ponieważ klasy kontrolek ActiveX są częścią biblioteki klas, można zastosować te same procedury i reguły dotyczące używania klas baz danych w standardowej aplikacji MFC do tworzenia kontrolek ActiveX korzystających z klas baz danych MFC.
Aby zapoznać się z ogólnym omówieniem klas baz danych MFC, zobacz MFC Database Classes (DAO i ODBC). W tym artykule przedstawiono zarówno klasy MFC ODBC, jak i klasy MFC DAO i kieruje Cię do dodatkowych informacji na ten temat.
Uwaga / Notatka
DaO jest obsługiwane za pośrednictwem pakietu Office 2013. DaO 3.6 jest wersją ostateczną i jest uważany za przestarzałą. Środowisko i kreatory języka Visual C++ nie obsługują dao (chociaż klasy DAO są uwzględnione i nadal można ich używać). Firma Microsoft zaleca używanie szablonów OLE DB lub ODBC i MFC dla nowych projektów. W przypadku obsługi istniejących aplikacji należy używać tylko dao.
Implementowanie właściwości sparametryzowanej
Właściwość sparametryzowana (czasami nazywana tablicą właściwości) jest metodą uwidaczniania homogenicznej kolekcji wartości jako pojedynczej właściwości kontrolki. Na przykład można użyć właściwości sparametryzowanej, aby uwidocznić tablicę lub słownik jako właściwość. W języku Visual Basic dostęp do takiej właściwości uzyskuje się za pomocą notacji tablicowej.
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ć właściwość sparametryzowaną. Kreator dodawania właściwości implementuje właściwość, dodając parę funkcji Get/Set, które umożliwiają użytkownikowi kontroli dostęp do właściwości przy użyciu powyższej notacji lub w standardowy sposób.
Podobnie jak w przypadku metod i właściwości, właściwości sparametryzowane mają również limit liczby dozwolonych parametrów. W przypadku właściwości sparametryzowanych limit wynosi 15 parametrów (z jednym parametrem zarezerwowanym do przechowywania wartości właściwości).
Poniższa procedura dodaje właściwość sparametryzowaną o nazwie Array, do której można uzyskać dostęp jako dwuwymiarową tablicę liczb całkowitych.
Aby dodać właściwość sparametryzowaną za pomocą Kreatora właściwości
Załaduj projekt kontrolki.
W widoku klasy rozwiń gałąź biblioteki kontrolki.
Kliknij prawym przyciskiem myszy węzeł interfejsu dla Twojej kontrolki (drugi węzeł węzła biblioteki), aby otworzyć menu skrótów.
W menu skrótów kliknij pozycję Dodaj , a następnie kliknij pozycję Dodaj właściwość.
W polu Nazwa właściwości wpisz
Array
.W polu Typ właściwości wybierz pozycję
short
.W polu Typ implementacji kliknij pozycję Pobierz/Ustaw metody.
W polach Pobierz funkcję i Ustaw funkcję wpisz unikatowe nazwy funkcji Get i Set Functions lub zaakceptuj nazwy domyślne.
Dodaj parametr o nazwie row (type short), używając kontrolek Nazwa parametru i Typ parametru .
Dodaj drugi parametr o nazwie column (typ short).
Kliknij przycisk Finish (Zakończ).
Zmiany wprowadzone przez Kreatora dodawania właściwości
Po dodaniu właściwości niestandardowej Kreator dodawania właściwości wprowadza zmiany w nagłówku klasy sterującej (.H) oraz w implementacji (.CPP).
Następujące wiersze są dodawane do pliku klasy kontrolnej .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 umożliwiają użytkownikowi żądanie określonego wiersza i kolumny podczas uzyskiwania dostępu do właściwości.
Ponadto Kreator dodawania właściwości dodaje następujące wiersze do mapy wysyłania kontrolek znajdującej się w implementacji klasy sterowania (. Plik CPP):
DISP_PROPERTY_PARAM_ID(CMyAxUICtrl, "Array", dispidArray, GetArray, SetArray, VT_I2, VTS_I2 VTS_I2)
Na koniec implementacje funkcji GetArray
i SetArray
są dodawane na końcu pliku .CPP. W większości przypadków będziesz modyfikować funkcję Get, aby zwrócić wartość właściwości. Funkcja Set będzie zwykle zawierać kod, który powinien zostać wykonany przed lub po zmianie właściwości.
Aby ta właściwość mogła być przydatna, można zadeklarować dwuwymiarową zmienną składową tablicy w klasie kontrolnej typu short
, aby przechowywać wartości dla właściwości sparametryzowanej. Następnie można zmodyfikować funkcję Get, aby zwrócić wartość przechowywaną w odpowiednim wierszu i kolumnie, zgodnie z parametrami, i zmodyfikować funkcję Set, aby zaktualizować wartość przywoływaną przez parametry wiersza i kolumny.
Obsługa błędów w kontrolce ActiveX
Jeśli w kontrolce wystąpią warunki błędu, może być konieczne zgłoszenie błędu do kontenera sterowania. Istnieją dwie metody raportowania błędów, w zależności od sytuacji, w której występuje błąd. Jeśli błąd występuje w funkcji Get lub Set właściwości lub w implementacji metody automatyzacji OLE, kontrolka powinna wywołać metodę COleControl::ThrowError, która sygnalizuje użytkownikowi sterującemu, że wystąpił błąd. Jeśli błąd wystąpi w dowolnym innym momencie, kontrolka powinna wywołać metodę COleControl::FireError, która uruchamia wbudowane zdarzenie błędu.
Aby wskazać rodzaj błędu, który wystąpił, kontrolka musi przekazać kod błędu do ThrowError
lub FireError
. Kod błędu to kod stanu OLE, który ma wartość 32-bitową. Jeśli to możliwe, wybierz kod błędu ze standardowego zestawu kodów zdefiniowanych w pliku nagłówkowym OLECTL.H. Poniższa tabela zawiera podsumowanie tych kodów.
Kody błędów kontrolek ActiveX
Błąd | Opis |
---|---|
CTL_E_NIELEGALNE_WYWOŁANIE_FUNKCJI | Niedozwolone wywołanie funkcji |
CTL_E_OVERFLOW | Przepełnienie |
CTL_E_OUTOFMEMORY | Za mało pamięci |
CTL_E_DIVISIONBYZERO | Dzielenie według zera |
CTL_E_OUTOFSTRINGSPACE | Brak miejsca na ciąg |
CTL_E_NIEDOSTATECZNA_PAMIĘĆ_STOSU | Brak miejsca na stosie |
CTL_E_ZLAPLIKUNAZWAALBONUMER | Nieprawidłowa nazwa pliku lub numer |
CTL_E_FILENOTFOUND | Nie znaleziono pliku |
CTL_E_BADFILEMODE | Nieprawidłowy tryb pliku |
CTL_E_FILE_ALREADY_OPEN - Plik jest już otwarty | Plik jest już otwarty |
CTL_E_DEVICEIOERROR | Błąd we/wy urządzenia |
CTL_E_FILEALREADYEXISTS (Plik już istnieje) | Plik już istnieje |
CTL_E_BADRECORDLENGTH - Niepoprawna długość rekordu | Nieprawidłowa długość rekordu |
CTL_E_DISKFULL | Pełny dysk |
CTL_E_BADRECORDNUMBER | Nieprawidłowy numer rekordu |
CTL_E_BADFILENAME (nieprawidłowa nazwa pliku) | Nieprawidłowa nazwa pliku |
CTL_E_TOOMANYFILES (Zbyt wiele plików) | Zbyt wiele plików |
CTL_E_URZĄDZENIE_NIEDOSTĘPNE | Urządzenie jest niedostępne |
CTL_E_ODRZUCENIE_DOSTĘPU | Odmowa uprawnień |
CTL_E_DYSK_NIEPRZYGOTOWANY | Dysk nie jest gotowy |
CTL_E_PATHFILEACCESSERROR: Błąd dostępu do ścieżki/pliku | Błąd dostępu do ścieżki/pliku |
CTL_E_PATHNOTFOUND | Nie można odnaleźć ścieżki |
CTL_E_INVALIDPATTERNSTRING - Nieprawidłowy ciąg wzorca | Nieprawidłowy ciąg wzorca |
CTL_E_INVALIDUSEOFNULL (Nieprawidłowe użycie wartości null) | Nieprawidłowe użycie wartości NULL |
CTL_E_INVALIDFILEFORMAT | Nieprawidłowy format pliku |
CTL_E_NIEPRAWIDŁOWAWARTOŚĆWŁAŚCIWOŚCI | Nieprawidłowa wartość właściwości |
Nieprawidłowy indeks tablicy właściwości (CTL_E_INVALIDPROPERTYARRAYINDEX) | Nieprawidłowy indeks tablicy właściwości |
CTL_E_SETNOTSUPPORTEDATRUNTIME | Konfiguracja nieobsługiwana w czasie wykonywania |
CTL_E_SETNOTSUPPORTED | Operacja ustawienia nieobsługiwana (właściwość tylko do odczytu) |
CTL_E_NEEDPROPERTYARRAYINDEX | Potrzebujesz indeksu tablicy właściwości |
Błąd CTL_E_SETNOTPERMITTED - Ustawienie niedozwolone | Ustaw niedozwolone |
CTL_E_GETNIESUPPORTEDZWYKONANIU | Pobieranie nie jest obsługiwane w czasie wykonywania |
CTL_E_GETNOTSUPPORTED | Operacja pobierająca nieobsługiwana (właściwość tylko do zapisu) |
CTL_B_NIEZNALAZŁOWŁAŚCIWOŚCI | Właściwość nie odnaleziona |
CTL_E_NIEPRAWIDŁOWYFORMATSCHOWKA | Nieprawidłowy format schowka |
CTL_E_INVALIDPICTURE: Niepoprawny obraz | Nieprawidłowy obraz |
CTL_E_BŁĄD_DRUKARKI | Błąd drukarki |
CTL_E_NIE_MOŻNA_ZAPISAĆ_PLIKU_DO_TEMP | Nie można zapisać pliku w temp |
CTL_E_SEARCHTEXTNOTFOUND | Nie można odnaleźć tekstu wyszukiwania |
CTL_E_REPLACEMENTSTOOLONG | Zamiany są zbyt długie |
W razie potrzeby użyj makra CUSTOM_CTL_SCODE, aby zdefiniować niestandardowy kod błędu dla warunku, który nie jest objęty jednym ze standardowych kodów. Parametr dla tego makra powinien być liczbą całkowitą z zakresu od 1000 do 32767 włącznie. Przykład:
#define MYCTL_E_SPECIALERROR CUSTOM_CTL_SCODE(1000)
Jeśli tworzysz kontrolkę ActiveX w celu zastąpienia istniejącej kontrolki VBX, zdefiniuj kody błędów kontrolek ActiveX tymi samymi wartościami liczbowymi, których używa kontrolka VBX, aby upewnić się, że kody błędów są zgodne.
Obsługa kluczy specjalnych w kontrolce
W niektórych przypadkach możesz chcieć obsłużyć niektóre kombinacje naciśnięć w specjalny sposób; na przykład wstaw nowy wiersz po naciśnięciu ENTER w wielowierszowej kontrolce pola tekstowego lub przemieszczaj się między grupą kontrolek edycji po naciśnięciu klawisza kierunkowego.
Jeśli klasa bazowa kontrolki ActiveX to COleControl
, można zastąpić CWnd::PreTranslateMessage, aby obsłużyć komunikaty przed ich przetworzeniem przez kontener. W przypadku korzystania z tej techniki zawsze zwracana jest wartość TRUE , jeśli komunikat jest obsługiwany w przesłonięciu elementu PreTranslateMessage
.
Poniższy przykład kodu przedstawia możliwy sposób obsługi komunikatów związanych z kluczami kierunkowymi.
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 na temat obsługi interfejsów klawiaturowych dla kontrolki ActiveX, zobacz dokumentację zestawu ActiveX SDK.
Uzyskiwanie dostępu do kontrolek okien dialogowych, które są niewidoczne w czasie wykonywania
Możesz utworzyć kontrolki okien dialogowych, które nie mają interfejsu użytkownika i są niewidoczne w czasie wykonywania. Jeśli do okna dialogowego zostanie dodana niewidoczna kontrolka ActiveX w czasie wykonywania i użyjesz kontrolki CWnd::GetDlgItem , aby uzyskać dostęp do kontrolki, kontrolka nie będzie działać poprawnie. Zamiast tego należy użyć jednej z następujących technik, aby uzyskać obiekt reprezentujący kontrolkę:
Za pomocą Kreatora dodawania zmiennej składowej wybierz pozycję Zmienna sterowania, a następnie wybierz identyfikator kontroli. Wprowadź nazwę zmiennej składowej i wybierz klasę otoki kontrolki jako typ kontrolki.
— lub —
Zadeklaruj zmienną lokalną i podklasę jako element okna dialogowego. Wstaw kod podobny do następującego (
CMyCtrl
to klasa opakowania, IDC_MYCTRL1 jest identyfikatorem kontrolki):CCirc myCirc; myCirc.SubclassDlgItem(IDC_CIRCCTRL2, this); // ... use myCirc ... myCirc.UnsubclassWindow();