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

  1. Załaduj projekt kontrolki.

  2. W widoku klasy rozwiń węzeł biblioteki kontrolki.

  3. Kliknij prawym przyciskiem myszy węzeł interfejsu kontrolki (drugi węzeł biblioteki), aby otworzyć menu skrótów.

  4. W menu skrótów kliknij pozycję Dodaj , a następnie kliknij pozycję Dodaj właściwość.

  5. W polu Nazwa właściwości wpisz Array.

  6. W polu Typ właściwości wybierz pozycję short.

  7. W polu Typ implementacji kliknij pozycję Pobierz/Ustaw metody.

  8. W polach Pobierz funkcję i Ustaw funkcję wpisz unikatowe nazwy funkcji Get i Set Functions lub zaakceptuj nazwy domyślne.

  9. Dodaj parametr o nazwie row (type short), używając kontrolek Nazwa parametru i Typ parametru.

  10. Dodaj drugi parametr o nazwie column (typ short).

  11. 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();
    

Zobacz też

Kontrolki ActiveX MFC