Udostępnij za pośrednictwem


Kontrolki ActiveX w Internecie

Kontrolki ActiveX to zaktualizowana wersja specyfikacji kontrolki OLE.

Ważne

ActiveX to starsza technologia, która nie powinna być używana do tworzenia nowych rozwiązań. Aby uzyskać więcej informacji, zobacz Kontrolki ActiveX.

Kontrolki są podstawową architekturą do tworzenia programowalnych składników oprogramowania, które mogą być używane w różnych kontenerach, w tym także przeglądarki internetowe obsługujące COM w Internecie. Dowolna kontrolka ActiveX może być kontrolką Internetową i może dodać jej funkcjonalność do aktywnego dokumentu lub być częścią strony sieci Web. Kontrolki na stronie sieci Web mogą komunikować się ze sobą przy użyciu skryptów.

Kontrolki ActiveX nie są ograniczone do Internetu. Kontrolka ActiveX może być również używana w dowolnym kontenerze, o ile kontrolka obsługuje interfejsy wymagane przez ten kontener.

Kontrolki ActiveX mają kilka zalet, w tym:

  • Mniej wymaganych interfejsów niż poprzednie kontrolki OLE.

  • Możliwość działania bez okien i stałego bycia aktywnym na miejscu.

Aby być kontrolką ActiveX, kontrolka musi:

  • Obsługa interfejsu IUnknown .

  • Być obiektem COM.

  • Eksportowanie bibliotek DLLRegisterServer i DLLUnRegisterServer.

  • Obsługa dodatkowych interfejsów zgodnie z potrzebami w celu zapewnienia funkcjonalności.

Tworzenie istniejących kontrolek Internet-Friendly

Projektowanie kontrolki, która będzie działać dobrze w środowisku internetowym, wymaga uwzględnienia stosunkowo niskich szybkości transmisji w Internecie. Możesz użyć istniejących kontrolek; Istnieją jednak kroki, które należy wykonać, aby rozmiar kodu był mniejszy i aby właściwości kontrolki były pobierane asynchronicznie.

Aby zwiększyć wydajność kontrolek, postępuj zgodnie z poniższymi wskazówkami dotyczącymi kwestii dotyczących wydajności:

  • Zaimplementuj techniki opisane w artykule Kontrolki ActiveX: Optymalizacja.

  • Rozważ, jak instancjonuje się kontrolkę.

  • Bądź asynchroniczny; nie zatrzymuj innych programów.

  • Pobieranie danych w małych blokach.

    Podczas pobierania dużych strumieni, takich jak mapy bitowe lub dane wideo, uzyskaj asynchroniczny dostęp do danych kontrolki we współpracy z kontenerem. Pobierz dane w sposób przyrostowy lub postępowy, współpracując z innymi kontrolkami, które mogą również pobierać dane. Kod może być również pobierany asynchronicznie.

  • Pobierz kod i właściwości w tle.

  • Jak najszybciej uaktywnij interfejs użytkownika.

  • Rozważ sposób przechowywania danych trwałych, zarówno właściwości, jak i dużych obiektów BLOB danych (takich jak obraz mapy bitowej lub dane wideo).

    Kontrolki zawierające znaczne ilości danych trwałych, takich jak duże mapy bitowe czy pliki AVI, wymagają starannego rozważenia metody pobierania. Dokument lub strona może stać się widoczna tak szybko, jak to możliwe, i umożliwić użytkownikowi interakcję ze stroną, podczas gdy kontrolki pobierają dane w tle.

  • Pisz wydajne procedury, aby zredukować rozmiar kodu i czas wykonywania.

    Małe kontrolki przycisków i etykiet, z zaledwie kilkoma bajtami trwałych danych, są odpowiednie do użytku w środowisku internetowym i działają dobrze w przeglądarkach.

  • Upewnij się, że postęp jest komunikowany do kontenera.

    Powiadom kontener o postępie pobierania asynchronicznego, w tym o tym, kiedy użytkownik może rozpocząć interakcję ze stroną, oraz po zakończeniu pobierania. Kontener może wyświetlać postęp (na przykład procent ukończenia) użytkownikowi.

  • Rozważ sposób rejestrowania kontrolek na komputerze klienckim.

Tworzenie nowej kontrolki ActiveX

Podczas tworzenia nowej kontrolki za pomocą Kreatora aplikacji można włączyć obsługę asynchronicznych monikerów oraz innych optymalizacji. Aby dodać obsługę pobierania właściwości kontrolki asynchronicznie, wykonaj następujące kroki:

Aby utworzyć projekt za pomocą Kreatora formantów ActiveX MFC

  1. Kliknij pozycję Nowy w menu Plik .

  2. Wybierz Kreator kontrolek ActiveX MFC z projektów Visual Studio C++ i nadaj nazwę projektowi.

  3. Na stronie Ustawienia sterowania wybierz pozycję Ładuj właściwości asynchronicznie. Wybranie tej opcji powoduje skonfigurowanie właściwości gotowego stanu oraz zdarzenia zmiany stanu.

    Możesz również wybrać inne optymalizacje, takie jak aktywacja bez okna, które opisano w temacie Kontrolki ActiveX: Optymalizacja.

  4. Wybierz pozycję Zakończ , aby utworzyć projekt.

Aby utworzyć klasę pochodzącą z klasy CDataPathProperty

  1. Utwórz klasę pochodzącą z CDataPathProperty.

  2. W każdym z plików źródłowych, które zawierają plik nagłówkowy dla kontrolki, dodaj plik nagłówka dla tej klasy przed nim.

  3. W tej klasie zastąp OnDataAvailable. Ta funkcja jest wywoływana za każdym razem, gdy dane są dostępne do wyświetlenia. Gdy dane staną się dostępne, możesz obsłużyć je w dowolny sposób, na przykład przez progresywne renderowanie.

    Poniższy fragment kodu jest prostym przykładem progresywnego wyświetlania danych w kontrolce edycji. Zwróć uwagę na użycie flagi BSCF_FIRSTDATANOTIFICATION w celu wyczyszczenia kontrolki edycji.

    void CMyDataPathProperty::OnDataAvailable(DWORD dwSize, DWORD bscfFlag)
    {
       CListCtrl list_ctrl;
       CEdit *edit = list_ctrl.GetEditControl();
       if ((bscfFlag & BSCF_FIRSTDATANOTIFICATION) && edit->m_hWnd)
       {
          edit->SetSel(0, -1);
          edit->Clear();
       }
    
       if (dwSize > 0)
       {
          CString string;
          LPTSTR str = string.GetBuffer(dwSize);
          UINT nBytesRead = Read(str, dwSize);
          if (nBytesRead > 0)
          {
             string.ReleaseBuffer(nBytesRead);
             edit->SetSel(-1, -1);
             edit->ReplaceSel(string);
          }
       }
    }
    

    Należy pamiętać, że musisz dołączyć element AFXCMN. H, aby użyć CListCtrl klasy .

  4. Gdy ogólny stan kontrolki zmieni się (na przykład z ładowania na zainicjalizowaną lub interaktywną), wywołaj metodę COleControl::InternalSetReadyState. Jeśli kontrolka ma tylko jedną właściwość ścieżki danych, możesz dodać kod w BSCF_LASTDATANOTIFICATION , aby powiadomić kontener o zakończeniu pobierania. Przykład:

    if (bscfFlag & BSCF_LASTDATANOTIFICATION)
    {
       GetControl()->InternalSetReadyState(READYSTATE_COMPLETE);
    }
    
  5. Zastąpij OnProgress. W OnProgress przekazano ci liczbę wskazującą maksymalny zakres oraz liczbę pokazującą postęp aktualnego pobierania. Możesz użyć tych liczb, aby wyświetlić stan, taki jak procent ukończenia dla użytkownika.

Następna procedura dodaje właściwość do kontrolki, aby użyć klasy niedawno utworzonej.

Aby dodać właściwość

  1. W widoku klasy kliknij prawym przyciskiem myszy interfejs pod węzłem biblioteki i wybierz polecenie Dodaj, a następnie dodaj właściwość. Spowoduje to uruchomienie Kreatora dodawania właściwości.

  2. W Kreatorze dodawania właściwości wybierz przycisk opcji Ustaw/Pobierz metody, wpisz nazwę właściwości, na przykład EditControlText, a następnie wybierz BSTR jako typ właściwości.

  3. Kliknij przycisk Finish (Zakończ).

  4. Zadeklaruj zmienną składową swojej klasy pochodnej CDataPathProperty w klasie kontrolki ActiveX.

    CMyDataPathProperty EditControlText;
    
  5. Zaimplementuj Get/Set metody. W polu Getzwróć ciąg . W przypadku Set załaduj właściwość i wywołaj SetModifiedFlag.

    BSTR CMFCActiveXControlCtrl::GetEditControlText(void)
    {
       AFX_MANAGE_STATE(AfxGetStaticModuleState());
    
       CString strResult;
       strResult = EditControlText.GetPath();
       return strResult.AllocSysString();
    }
    
    void CMFCActiveXControlCtrl::SetEditControlText(LPCTSTR newVal)
    {
       AFX_MANAGE_STATE(AfxGetStaticModuleState());
    
       Load(newVal, EditControlText);
       SetModifiedFlag();
    }
    
  6. W programie DoPropExchange dodaj następujący wiersz:

    PX_DataPath(pPX, _T("DataPath"), EditControlText);
    
  7. Nadpisz ResetData, aby powiadomić właściwość o zresetowaniu swojej kontrolki, dodając następujący wiersz:

    EditControlText.ResetData();
    

Podejmowanie decyzji, czy dziedziczyć z CDataPathProperty czy z CCachedDataPathProperty

W poprzednim przykładzie opisano kroki wyprowadzania właściwości kontrolki z CDataPathProperty elementu. Jest to dobry wybór, jeśli pobierasz dane w czasie rzeczywistym, które często się zmieniają, i dla których nie trzeba przechowywać wszystkich danych, ale tylko bieżącą wartość. Przykładem jest kontrolka znacznika zapasów.

Można również dziedziczyć po CCachedDataPathProperty. W takim przypadku pobrane dane są buforowane w pliku pamięci. Jest to dobry wybór, jeśli chcesz zachować wszystkie pobrane dane — na przykład kontrolkę, która stopniowo renderuje mapę bitową. W takim przypadku klasa ma zmienną składową zawierającą twoje dane.

CMemFile m_Cache;

W klasie kontrolki ActiveX możesz użyć tego pliku mapowanego w pamięci w OnDraw, aby wyświetlić dane. W kontrolce pochodnej klasy CCachedDataPathProperty-pochodnej zastąp funkcję składową OnDataAvailable i unieważnij kontrolkę po wywołaniu implementacji klasy bazowej.

void CMyCachedDataPathProperty::OnDataAvailable(DWORD dwSize, DWORD bscfFlag)
{
   CCachedDataPathProperty::OnDataAvailable(dwSize, bscfFlag);
   GetControl()->InvalidateControl();
}

Pobieranie danych asynchronicznie przy użyciu kontrolek ActiveX

Pobieranie danych za pośrednictwem sieci powinno odbywać się asynchronicznie. Zaletą tego jest to, że w przypadku przesyłania dużej ilości danych lub gdy połączenie jest powolne, proces pobierania nie zablokuje innych procesów na kliencie.

Asynchroniczne monikery umożliwiają pobieranie danych asynchronicznie przez sieć. Operacja odczytu na asynchronicznym monikerze zwraca od razu, nawet jeśli operacja nie została ukończona.

Jeśli na przykład jest dostępnych tylko 10 bajtów, a odczyt jest wywoływany asynchronicznie w pliku 1K, odczyt nie blokuje, ale zwraca obecnie dostępne 10 bajtów.

Implementujesz asynchroniczne monikery przy użyciu klasy CAsyncMonikerFile. Jednak kontrolki ActiveX mogą używać CDataPathProperty klasy , która pochodzi z CAsyncMonikerFileklasy , aby ułatwić implementację właściwości kontrolki asynchronicznej.

Wyświetlanie kontrolki na stronie sieci Web

Oto przykład tagu obiektu i atrybutów do wstawiania kontrolki na stronie sieci Web.

<OBJECT
  CLASSID="clsid:FC25B780-75BE-11CF-8B01-444553540000"
  CODEBASE="/ie/download/activex/iechart.ocx"
  ID=chart1
  WIDTH=400
  HEIGHT=200
  ALIGN=center
  HSPACE=0
  VSPACE=0>
  <PARAM NAME="BackColor" value="#ffffff"/>
  <PARAM NAME="ForeColor" value="#0000ff"/>
  <PARAM NAME="url" VALUE="/ie/controls/chart/mychart.txt"/>
</OBJECT>

Aktualizowanie istniejącej kontrolki OLE do korzystania z nowych funkcji kontrolek ActiveX

Jeśli kontrolka OLE została utworzona przy użyciu wersji programu Visual C++ wcześniejszej niż 4.2, możesz wykonać kroki, aby poprawić jego wydajność i zwiększyć jego funkcjonalność. Aby zapoznać się ze szczegółowym omówieniem tych zmian, zobacz ActiveX Controls: Optimization (Kontrolki ActiveX: optymalizacja).

Jeśli dodajesz obsługę właściwości asynchronicznych do istniejącej kontrolki, będziesz musiał dodać właściwość stanu gotowości i zdarzenie ReadyStateChange samodzielnie. W konstruktorze kontrolki dodaj:

m_lReadyState = READYSTATE_LOADING;

Stan gotowości zostanie zaktualizowany podczas pobierania kodu przez wywołanie metody COleControl::InternalSetReadyState. Jednym z miejsc, z którego można wywołać InternalSetReadyState, jest zastąpienie OnProgress w klasie pochodnej od CDataPathProperty.

Zobacz także

Zadania programowania internetowego MFC
Podstawy programowania internetowego MFC