Formanty 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 przeglądarki sieci Web 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ść bycia bez okien i zawsze aktywna w 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 przyjaznych dla Internetu

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ż utworzenie wystąpienia kontrolki.

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

  • Pobieranie danych w małych blokach.

    Podczas pobierania dużych strumieni, takich jak mapy bitowe lub dane wideo, uzyskaj dostęp do danych kontroli asynchronicznie we współpracy z kontenerem. Pobierz dane w sposób przyrostowy lub progresywny, współpracując ze sobą 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 ze znaczną ilością trwałych danych, takich jak duże mapy bitowe lub pliki AVI, wymagają starannej uwagi na pobieranie metody. 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.

  • Pisanie wydajnych procedur w celu zachowania rozmiaru kodu i czasu 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.

  • Rozważ przekazanie postępu 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 przy użyciu Kreatora aplikacji można włączyć obsługę asynchronicznych elementów monikers, a także 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 pozycję Kreator kontrolek ActiveX MFC z projektów Visual Studio C++ i nadaj projektowi nazwę.

  3. Na stronie Ustawienia sterowania wybierz pozycję Ładuj właściwości asynchronicznie. Wybranie tej opcji powoduje skonfigurowanie właściwości gotowego stanu i zdarzenia gotowego do 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 CDataPathPropertyklasy .

  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ąpij wartość 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 BSCF_FIRSTDATANOTIFICATION flagi, aby wyczyścić kontrolkę 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 od ładowania do interakcyjnego inicjowania lub interakcyjnego użytkownika), 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 OnProgresssystemie przekazano liczbę z maksymalnym zakresem i liczbą pokazującą, jak daleko wzdłuż bieżącego pobierania jest. 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 właśnie pochodnej.

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 radiowy Ustaw/Pobierz metody, wpisz nazwę właściwości, na przykład EditControlText, a następnie wybierz pozycję BSTR jako typ właściwości.

  3. Kliknij przycisk Finish (Zakończ).

  4. Zadeklaruj zmienną składową klasy pochodnej do klasy kontrolki CDataPathPropertyActiveX.

    CMyDataPathProperty EditControlText;
    
  5. Zaimplementuj Get/Set metody. W polu Getzwróć ciąg . W przypadku Setpolecenia załaduj właściwość i wywołaj metodę 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. Zastąpij wartość ResetData , aby powiadomić właściwość o zresetowaniu jej kontrolki, dodając następujący wiersz:

    EditControlText.ResetData();
    

Podejmowanie decyzji, czy pochodzić z CDataPathProperty lub CCachedDataPathProperty

W poprzednim przykładzie opisano kroki wyprowadzania właściwości kontrolki z CDataPathPropertyelementu . 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ż pochodzić z klasy 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ą dane:

CMemFile m_Cache;

W klasie formantów ActiveX możesz użyć tego pliku mapowanego pamięci w programie, OnDraw aby wyświetlić dane. W kontrolce CCachedDataPathPropertyActiveX -pochodnej klasy zastąp funkcję OnDataAvailable składową i unieważnij ją 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 karty umożliwiają asynchroniczne pobieranie danych za pośrednictwem sieci. Operacja odczytu na asynchronicznej moniker zwraca natychmiast, 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.

Zaimplementujesz asynchroniczne elementy monikers przy użyciu CAsyncMonikerFile klasy . 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 dodasz obsługę właściwości asynchronicznych do istniejącej kontrolki, musisz dodać właściwość gotowego stanu i ReadyStateChange zdarzenie 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 wywołań InternalSetReadyState jest OnProgress zastąpienie klasy -pochodnej CDataPathProperty.

Zobacz też

MFC — zadania związane z programowaniem Internetu
MFC — podstawy programowania Internetu