Kontrolki ActiveX MFC: tematy zaawansowane
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
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ę 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ć 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ą przy użyciu Kreatora dodawania właściwości
Załaduj projekt kontrolki.
W widoku klasy rozwiń węzeł biblioteki kontrolki.
Kliknij prawym przyciskiem myszy węzeł interfejsu kontrolki (drugi węzeł 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) i implementacja (. Pliki CPP).
Następujące wiersze są dodawane do klasy kontrolek . 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 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 GetArray
funkcji i SetArray
są dodawane na końcu elementu . Plik CPP. W większości przypadków zmodyfikujesz 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 zdarzenie błędu akcji.
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 OLECTL. Plik nagłówka H. Poniższa tabela zawiera podsumowanie tych kodów.
Kody błędów kontrolek 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 według zera |
CTL_E_OUTOFSTRINGSPACE | Za mało miejsca na ciąg |
CTL_E_OUTOFSTACKSPACE | Za mało miejsca na stosie |
CTL_E_BADFILENAMEORNUMBER | Zła nazwa lub numer pliku |
CTL_E_FILENOTFOUND | Nie znaleziono pliku |
CTL_E_BADFILEMODE | Zły tryb pliku |
CTL_E_FILEALREADYOPEN | Plik jest już otwarty |
CTL_E_DEVICEIOERROR | Błąd We/Wy urządzenia |
CTL_E_FILEALREADYEXISTS | Plik już istnieje |
CTL_E_BADRECORDLENGTH | Zła długość rekordu |
CTL_E_DISKFULL | Dysk zapełniony |
CTL_E_BADRECORDNUMBER | Nieprawidłowy numer rekordu |
CTL_E_BADFILENAME | Nieprawidłowa nazwa pliku |
CTL_E_TOOMANYFILES | Za dużo 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 ścieżki/pliku |
CTL_E_PATHNOTFOUND | Nie można odnaleźć ścieżki |
CTL_E_INVALIDPATTERNSTRING | Nieprawidłowy ciąg wzorca |
CTL_E_INVALIDUSEOFNULL | Nieprawidłowe użycie wartości 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 | Ustawianie nieobsługiwane w czasie wykonywania |
CTL_E_SETNOTSUPPORTED | Ustaw nieobsługiwane (właściwość tylko do odczytu) |
CTL_E_NEEDPROPERTYARRAYINDEX | Potrzebny indeks tablicy właściwości |
CTL_E_SETNOTPERMITTED | Ustaw niedozwolone |
CTL_E_GETNOTSUPPORTEDATRUNTIME | Pobieranie nieobsługiwane w czasie wykonywania |
CTL_E_GETNOTSUPPORTED | Pobieranie nieobsługiwane (właściwość tylko do zapisu) |
CTL_E_PROPERTYNOTFOUND | Nie odnaleziono 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 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ęć klawiszy w specjalny sposób; na przykład wstaw nowy wiersz po naciśnięciu klawisza ENTER w kontrolce wielowierszowego pola tekstowego lub przenoś się między grupą kontrolek edycji po naciśnięciu identyfikatora klawisza kierunkowego.
Jeśli klasa bazowa kontrolki ActiveX to COleControl
, można zastąpić CWnd::P reTranslateMessage w celu obsługi komunikatów przed ich przetwarzaniem 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 kontrolki. 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 otoki, IDC_MYCTRL1 jest identyfikatorem kontrolki):CCirc myCirc; myCirc.SubclassDlgItem(IDC_CIRCCTRL2, this); // ... use myCirc ... myCirc.UnsubclassWindow();