Udostępnij za pośrednictwem


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

  1. Załadować projekt programu kontroli.

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

  3. Kliknij prawym przyciskiem myszy węzeł interfejsu dla formantu (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 pozycję krótki.

  7. Dla wykonania typu, kliknij Metody Get i Set.

  8. W Uzyskać funkcji i Ustawić funkcję polach wpisz unikatowych nazw dla Get i Set funkcje lub zaakceptować nazwy domyślne.

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

  10. Dodać drugi parametr o nazwie column (typu short).

  11. Kliknij Zakończ.

2dffbw6e.collapse_all(pl-pl,VS.110).gifZmiany 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();
    

Zobacz też

Koncepcje

Formanty ActiveX MFC