Controlli ActiveX in Internet

I controlli ActiveX sono la versione aggiornata della specifica del controllo OLE.

Importante

ActiveX è una tecnologia legacy che non deve essere usata per il nuovo sviluppo. Per altre informazioni, vedere Controlli ActiveX.

I controlli sono un'architettura principale per lo sviluppo di componenti software programmabili che possono essere usati in un'ampia gamma di contenitori diversi, inclusi i Web browser in grado di supportare COM su Internet. Qualsiasi controllo ActiveX può essere un controllo Internet e può aggiungerne la funzionalità a un documento attivo o far parte di una pagina Web. I controlli in una pagina Web possono comunicare tra loro tramite scripting.

I controlli ActiveX non sono limitati a Internet. Un controllo ActiveX può essere usato anche in qualsiasi contenitore, purché il controllo supporti le interfacce richieste da tale contenitore.

I controlli ActiveX presentano diversi vantaggi, tra cui:

  • Meno interfacce necessarie rispetto ai controlli OLE precedenti.

  • Possibilità di essere senza finestra e sempre attiva sul posto.

Per essere un controllo ActiveX, un controllo deve:

  • Supportare l'interfaccia IUnknown .

  • Essere un oggetto COM.

  • Esportare DLLRegisterServer e DLLUnRegisterServer.

  • Supportare interfacce aggiuntive in base alle esigenze per la funzionalità.

Rendere i controlli esistenti compatibili con Internet

La progettazione di un controllo che funzionerà bene in un ambiente Internet richiede una considerazione per le frequenze di trasmissione relativamente basse su Internet. È possibile usare i controlli esistenti; Esistono tuttavia passaggi da eseguire per rendere le dimensioni del codice più piccole e per rendere asincrone le proprietà del controllo scaricate.

Per migliorare le prestazioni dei controlli, seguire questi suggerimenti sulle considerazioni sull'efficienza:

  • Implementare le tecniche descritte nell'articolo Controlli ActiveX: Ottimizzazione.

  • Valutare il modo in cui viene creata un'istanza di un controllo.

  • Essere asincroni; non tenere altri programmi.

  • Scaricare i dati in blocchi di piccole dimensioni.

    Quando si scaricano flussi di grandi dimensioni, ad esempio bitmap o dati video, accedere ai dati di un controllo in modo asincrono in collaborazione con il contenitore. Recuperare i dati in modo incrementale o progressivo, lavorando in modo cooperativo con altri controlli che possono anche recuperare i dati. Il codice può anche essere scaricato in modo asincrono.

  • Scaricare codice e proprietà in background.

  • Diventa l'interfaccia utente attiva il più rapidamente possibile.

  • Considerare il modo in cui vengono archiviati i dati persistenti, sia le proprietà che i BLOB di dati di grandi dimensioni, ad esempio un'immagine bitmap o dati video.

    I controlli con quantità significative di dati persistenti, ad esempio bitmap di grandi dimensioni o file AVI, richiedono attenzione al metodo di download. Un documento o una pagina può diventare visibile il prima possibile e consentire all'utente di interagire con la pagina mentre i controlli recuperano i dati in background.

  • Scrivere routine efficienti per mantenere le dimensioni del codice e il tempo di esecuzione inattivo.

    I controlli pulsante e etichetta di piccole dimensioni, con solo pochi byte di dati persistenti, sono adatti per l'uso nell'ambiente Internet e funzionano bene all'interno dei browser.

  • Prendere in considerazione lo stato di avanzamento comunicato al contenitore.

    Notificare al contenitore lo stato di avanzamento nel download asincrono, incluso quando l'utente può iniziare a interagire con una pagina e al termine del download. Il contenitore può visualizzare lo stato di avanzamento (ad esempio la percentuale di completamento) all'utente.

  • Valutare il modo in cui i controlli vengono registrati nel computer client.

Creazione di un nuovo controllo ActiveX

Quando si crea un nuovo controllo tramite la Creazione guidata applicazione, è possibile scegliere di abilitare il supporto per moniker asincroni e altre ottimizzazioni. Per aggiungere il supporto per scaricare le proprietà del controllo in modo asincrono, seguire questa procedura:

Per creare il progetto tramite la Creazione guidata controllo ActiveX MFC

  1. Fare clic su Nuovo dal menu File .

  2. Selezionare MFC ActiveX Control Wizard (Creazione guidata controllo ActiveX MFC) nei progetti di Visual Studio C++ e assegnare un nome al progetto.

  3. Nella pagina Controllo Impostazioni selezionare Carica proprietà in modo asincrono. Selezionando questa opzione viene impostata la proprietà di stato pronta e l'evento di modifica dello stato pronto per l'utente.

    È anche possibile selezionare altre ottimizzazioni, ad esempio l'attivazione senza finestra, descritta in Controlli ActiveX: Ottimizzazione.

  4. Scegliere Fine per creare il progetto.

Per creare una classe derivata da CDataPathProperty

  1. Creare una classe derivata da CDataPathProperty.

  2. In ogni file di origine che include il file di intestazione per il controllo aggiungere il file di intestazione per questa classe prima.

  3. In questa classe eseguire l'override di OnDataAvailable. Questa funzione viene chiamata ogni volta che i dati sono disponibili per la visualizzazione. Man mano che i dati diventano disponibili, è possibile gestirli in qualsiasi modo, ad esempio eseguendo il rendering progressivo.

    L'estratto di codice riportato di seguito è un semplice esempio di visualizzazione progressiva dei dati in un controllo di modifica. Si noti l'uso del flag BSCF_FIRSTDATANOTIFICATION per cancellare il controllo di modifica.

    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);
          }
       }
    }
    

    Si noti che è necessario includere AFXCMN. H per usare la CListCtrl classe .

  4. Quando lo stato complessivo del controllo cambia (ad esempio, dal caricamento all'inizializzazione o all'utente interattivo), chiamare COleControl::InternalSetReadyState. Se il controllo dispone di una sola proprietà del percorso dati, è possibile aggiungere codice in BSCF_LASTDATANOTIFICATION per notificare al contenitore che il download è stato completato. Ad esempio:

    if (bscfFlag & BSCF_LASTDATANOTIFICATION)
    {
       GetControl()->InternalSetReadyState(READYSTATE_COMPLETE);
    }
    
  5. Eseguire l'override di OnProgress. In OnProgressviene passato un numero che mostra l'intervallo massimo e un numero che mostra la distanza del download corrente. È possibile usare questi numeri per visualizzare lo stato, ad esempio la percentuale di completamento per l'utente.

La routine successiva aggiunge una proprietà al controllo per usare la classe appena derivata.

Per aggiungere una proprietà

  1. In Visualizzazione classi fare clic con il pulsante destro del mouse sull'interfaccia sotto il nodo della libreria e selezionare Aggiungi, quindi Aggiungi proprietà. Verrà avviata l'Aggiunta guidata proprietà.

  2. Nella Procedura guidata Aggiungi proprietà selezionare il pulsante di opzione Imposta/Ottieni metodi, digitare il nome della proprietà, ad esempio EditControlText e selezionare BSTR come tipo di proprietà.

  3. Fare clic su Fine.

  4. Dichiarare una variabile membro della CDataPathPropertyclasse derivata da -nella classe di controllo ActiveX.

    CMyDataPathProperty EditControlText;
    
  5. Implementare i metodi Get/Set. Per Get, restituire la stringa. Per Setcaricare la proprietà e chiamare 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. In DoPropExchange aggiungere la riga seguente:

    PX_DataPath(pPX, _T("DataPath"), EditControlText);
    
  7. Eseguire l'override di ResetData per notificare alla proprietà di reimpostare il controllo aggiungendo questa riga:

    EditControlText.ResetData();
    

Decidere se derivare da CDataPathProperty o CCachedDataPathProperty

Nell'esempio precedente vengono descritti i passaggi per derivare la proprietà del controllo da CDataPathProperty. Questa è una buona scelta se si scaricano dati in tempo reale che cambiano frequentemente e per cui non è necessario conservare tutti i dati, ma solo il valore corrente. Un esempio è un controllo ticker azionario.

È anche possibile derivare da CCachedDataPathProperty. In questo caso, i dati scaricati vengono memorizzati nella cache in un file di memoria. Questa è una buona scelta se è necessario mantenere tutti i dati scaricati, ad esempio un controllo che esegue il rendering progressivo di una bitmap. In questo caso, la classe ha una variabile membro contenente i dati:

CMemFile m_Cache;

Nella classe di controllo ActiveX è possibile usare questo file mappato alla memoria in OnDraw per visualizzare i dati. Nella classe derivata dal controllo CCachedDataPathPropertyActiveX eseguire l'override della funzione OnDataAvailable membro e invalidare il controllo dopo aver chiamato l'implementazione della classe base.

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

Download di dati in modo asincrono tramite controlli ActiveX

Il download dei dati in una rete deve essere eseguito in modo asincrono. Il vantaggio di farlo è che se viene trasferita una grande quantità di dati o se la connessione è lenta, il processo di download non bloccherà altri processi nel client.

I moniker asincroni consentono di scaricare i dati in modo asincrono in rete. Un'operazione di lettura su un moniker asincrono restituisce immediatamente, anche se l'operazione non è stata completata.

Ad esempio, se sono disponibili solo 10 byte e Read viene chiamato in modo asincrono in un file 1K, Read non blocca, ma restituisce con i 10 byte attualmente disponibili.

Si implementano moniker asincroni usando la CAsyncMonikerFile classe . Tuttavia, i controlli ActiveX possono usare la CDataPathProperty classe , derivata da CAsyncMonikerFile, per implementare le proprietà del controllo asincrono.

Visualizzazione di un controllo in una pagina Web

Di seguito è riportato un esempio di tag oggetto e attributi per l'inserimento di un controllo in una pagina 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>

Aggiornamento di un controllo OLE esistente per l'uso di nuove funzionalità di controllo ActiveX

Se il controllo OLE è stato creato con una versione di Visual C++ precedente alla 4.2, è possibile eseguire passaggi per migliorarne le prestazioni e migliorarne le funzionalità. Per una descrizione dettagliata di queste modifiche, vedere Controlli ActiveX: Ottimizzazione.

Se si aggiunge il supporto delle proprietà asincrone a un controllo esistente, sarà necessario aggiungere manualmente la proprietà di stato pronta e l'evento ReadyStateChange . Nel costruttore per il controllo aggiungere:

m_lReadyState = READYSTATE_LOADING;

Lo stato pronto verrà aggiornato quando il codice viene scaricato chiamando COleControl::InternalSetReadyState. Una posizione che è possibile chiamare InternalSetReadyState è dall'override OnProgress della CDataPathPropertyclasse derivata da .

Vedi anche

Attività di programmazione Internet MFC
Nozioni di base sulla programmazione Internet MFC