Partager via


Contrôles ActiveX sur Internet

Les contrôles ActiveX sont la version mise à jour de la spécification de contrôle OLE.Les contrôles sont une architecture principale pour développer des logiciels programmables qui peuvent être utilisés dans divers conteneurs, y compris les navigateurs Web COM-avertis sur Internet.Tout contrôle ActiveX peut être un contrôle Internet et peut ajouter ses fonctionnalités à un document actif ou faire partie d'une page Web.Les contrôles sur une page Web peuvent communiquer les uns avec les autres à l'aide de script.

Les contrôles ActiveX n'est pas limitée à Internet.Un contrôle ActiveX peut également être utilisé dans tout conteneur, tant que le contrôle prend en charge les interfaces requises par ce conteneur.

Les contrôles ActiveX ont plusieurs avantages, notamment :

  • Moins d'interfaces requises par les contrôles OLE précédents.

  • La capacité d'être actif sans fenêtre et toujours sur place.

Pour être un contrôle ActiveX, un contrôle doit :

  • Prennent en charge l'interface d' IUnknown .

  • Doit être un objet COM.

  • Exportation DLLRegisterServer et DLLUnRegisterServer.

  • Interfaces supplémentaires de support que nécessaire pour la fonctionnalité.

Vous faites vos contrôles existants Outil de conception pour Internet-Conviviaux

Concevoir un contrôle qui fonctionnera correctement dans un environnement Internet requiert la considération pour les débits de communication relativement faible sur Internet.Vous pouvez utiliser vos contrôles existants ; toutefois, il y a des étapes que vous devez prendre pour rendre le nombre d'instructions plus petit et créer vos propriétés de contrôle télécharger de façon asynchrone.

Pour améliorer les performances de vos contrôles, suivez ces conseils sur les considérations relatives à l'efficacité :

  • Implémentez les techniques décrites dans l'article Contrôles ActiveX : optimisation.

  • Observez comment un contrôle est instancié.

  • Assurez asynchrone ; ne différer pas d'autres programmes.

  • Données de téléchargement en petits blocs.

    Lorsque vous téléchargez des larges flux de données tels que des images ou des données vidéo, accédez aux paramètres de façon asynchrone en coopération avec le conteneur.Récupérez les données de façon incrémentielle ou progressive, depuis de manière coopérative avec d'autres contrôles qui peuvent être également de récupérer les données.Le code peut également le télécharger à partir de façon asynchrone.

  • Téléchargez le code et les propriétés en arrière-plan.

  • Deviennent l'interface utilisateur permet aussi rapidement que possible.

  • Observez comment les données persistante est enregistrée, des propriétés et des grands objets BLOB de données (tels qu'une image bitmap ou des données vidéo).

    Les contrôles avec une quantité importante de données persistantes, telles que des grands bitmap ou fichiers AVI, nécessitent une attention particulière à télécharger la méthode.Un document ou une page peut apparaître dès que possible, et permet à l'utilisateur d'interagir avec la page pendant que les contrôles extraient des données en arrière-plan.

  • Entrez les routines effectives pour réduire le nombre et le moment de l'exécution d'instructions.

    Le petits bouton et contrôles label, avec quelques octets de données persistantes, conviennent à utiliser dans l'environnement Internet et fonctionnent bien les navigateurs intérieurs.

  • Considérez la progression est communiqué au conteneur.

    Indiquez au conteneur de progression du téléchargement asynchrone, y compris lorsque l'utilisateur peut commencer à interagir avec une page, et lorsque le téléchargement.Le conteneur peut consulter la progression (par exemple les pourcentage réalisé) à l'utilisateur.

  • Considérez la manière dont les contrôles sont enregistrés sur l'ordinateur client.

Créer un contrôle ActiveX

En créant un nouveau contrôle à l'aide de l'Assistant Application, vous pouvez choisir d'activer la prise en charge des monikers asynchrones ainsi que d'autres aspects.Pour ajouter la prise en charge des propriétés du contrôle de téléchargement de façon asynchrone, suivez ces étapes :

Pour créer votre projet à l'aide de l'Assistant Contrôle ActiveX MFC

  1. Cliquez sur New dans le menu de Fichier .

  2. Sélectionnez MFC ActiveX Control Wizard des projets Visual C++ et nommez votre projet.

  3. Dans la page de Control Settings , sélectionnez Loads properties asynchronously.Lorsque cette option crée la propriété d'état prêt et l'événement de modification d'état prêt pour vous.

    Vous pouvez également sélectionner d'autres optimisations, telles que Windowless activation, ce qui est décrit dans Contrôles ActiveX : optimisation.

  4. Choisissez Terminer pour créer le projet.

Pour créer une classe dérivée de CDataPathProperty

  1. Créez une classe dérivée d' CDataPathProperty.

  2. Dans chacun de vos fichiers sources qui inclut le fichier d'en-tête pour votre contrôle, ajoutez le fichier d'en-tête pour cette classe avant celui-ci.

  3. Dans cette classe hôte, substituez OnDataAvailable.Cette fonction est appelée chaque fois que les données sont disponibles pour l'affichage.À mesure que les données deviennent disponibles, vous pouvez le gérer toute façon que vous choisissez, par exemple en l'affichant progressivement.

    L'extrait de code suivant est un exemple simple d'afficher progressivement des données dans un contrôle d'édition.Notez l'utilisation de la balise BSCF_FIRSTDATANOTIFICATION de désactiver le contrôle d'édition.

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

    Notez que vous devez inclure AFXCMN.H pour utiliser la classe d' CListCtrl .

  4. Lorsque modifications d'état global de votre contrôle (par exemple, le chargement à initialisé ou de l'utilisateur interactive), un appel COleControl::InternalSetReadyState.Si votre contrôle une seule propriété de chemin d'accès aux données, vous pouvez ajouter du code sur BSCF_LASTDATANOTIFICATION pour informer le conteneur que votre téléchargement.Par exemple :

    if (bscfFlag & BSCF_LASTDATANOTIFICATION)
    {
       GetControl()->InternalSetReadyState(READYSTATE_COMPLETE);
    }
    
  5. Override OnProgress.Dans OnProgress, vous avez passé un nombre pour indiquer la plage maximale et un nombre indiquant la distance le long de le téléchargement actuel est.Vous pouvez utiliser ces nombres pour afficher l'état telles que les pourcentage réalisé à l'utilisateur.

La procédure suivante ajoute une propriété au contrôle d'utiliser la classe simplement dérivée.

Pour ajouter une propriété

  1. Dans Affichage de classes, cliquez avec le bouton droit sur l'interface sous le nœud de bibliothèque et sélectionnez Ajouter, puis Ajouter une propriété.Cela commence Add Property Wizard.

  2. Dans Add Property Wizard, sélectionnez la case d'option de Set/Get Methods , tapez Nom de la propriété, par exemple, EditControlText, puis sélectionnez un BSTR comme Property type.

  3. Cliquez sur Terminer.

  4. Déclarez une variable membre de votre CDataPathPropertyclasse dérivée à votre classe de contrôles ActiveX.

    CMyDataPathProperty EditControlText;
    
  5. Implémentez les méthodes de Get/Set .Pour Obtenir, retournez la chaîne.Pour Set, chargez la propriété et appelez 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. Dans DoPropExchange, ajoutez la ligne suivante :

    PX_DataPath(pPX, _T("DataPath"), EditControlText);
    
  7. Substituez ResetData pour indiquer à la propriété de réinitialiser son contrôle en ajoutant la ligne suivante :

    EditControlText.ResetData();
    

Décider si dériver de CDataPathProperty ou de CCachedDataPathProperty

L'exemple précédent décrit comment dériver la propriété de votre contrôle d' CDataPathProperty.Il s'agit d'un bon choix si vous téléchargez les données en temps réel de qui modifient fréquemment, et pour de ce que vous n'avez pas besoin de conserver toutes les données, mais uniquement la valeur actuelle.Un exemple est un contrôle stock ticker.

Vous pouvez également dériver d' CCachedDataPathProperty.Dans ce cas, les données téléchargée est mise en cache dans un fichier de mémoire.Il s'agit d'un bon choix si vous devez conserver toutes les données téléchargées — par exemple, un contrôle qui affiche progressivement une bitmap.Dans ce cas, la classe possède une variable membre contenant vos données :

CMemFile m_Cache;

Dans votre classe de contrôles ActiveX, vous pouvez utiliser ce fichier mappé en mémoire dans OnDraw pour afficher les données.Dans votre contrôle ActiveX CCachedDataPathPropertyclasse dérivée de, substituez la fonction membre OnDataAvailable et invalidez le contrôle, après avoir appelé l'implémentation de la classe de base.

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

Données de téléchargement de façon asynchrone à l'aide de contrôles ActiveX

De télécharger des données sur un réseau doivent être exécutées de façon asynchrone.L'avantage de procéder est que si une grande quantité de données sont transférées ou si la connexion est lente, l'opération de téléchargement ne se bloque pas d'autres processus sur le client.

Les monikers asynchrones permettent de télécharger des données de manière asynchrone sur un réseau.Une opération de lecture sur un moniker asynchrone retourne immédiatement, même si l'opération n'a pas été effectuée.

Par exemple, si seulement 10 octets sont disponibles et la lecture est appelée de façon asynchrone sur un fichier 1K, la lecture ne bloque pas, mais retourne avec les 10 octets actuellement disponibles.

Vous implémentez monikers asynchrones à l'aide de la classe d' CAsyncMonikerFile .Toutefois, les contrôles ActiveX peuvent utiliser la classe d' CDataPathProperty , qui est dérivée d' CAsyncMonikerFile, pour aider à implémenter des propriétés de contrôle asynchrones.

L'exemple d'ASYNDOWN montre comment installer une boucle asynchrone à des délais pour lire les données.ASYNDOWN est décrit en détail dans l'article de la Base de connaissances « HOWTO : AsyncDown montre le téléchargement asynchrone de données » (Q177244) et est téléchargeable du Centre de téléchargement Microsoft.(Pour plus d'informations sur le téléchargement de fichiers de le Centre de téléchargement Microsoft, consultez l'article « comment obtenir des fichiers de support technique Microsoft des services en ligne » (Q119591) dans la Base de connaissances Microsoft.) Vous trouverez les articles de la Base de connaissances sur le CD-ROM de MSDN Library ou à l'adresse https://support.microsoft.com/default.aspx.

La technique de base utilisée dans ASYNDOWN est de définir une minuterie en CDataPathProperty::OnDataAvailable pour indiquer quand les données sont disponibles.Lorsque le message de minuterie est accepté, l'application lit dans 128 blocs d'octets de données et remplit le contrôle d'édition.Si les données sont pas disponible lorsque le message de minuterie est traité, la minuterie est arrêtée.OnDataAvailable démarre la minuterie si plus de données arrivent ultérieurement.

Afficher un contrôle sur une page Web

Voici un exemple d'une balise object et des attributs pour insérer un contrôle sur une page 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>

Mettre à jour un contrôle OLE existant pour utiliser les nouvelles fonctionnalités de contrôle ActiveX

Si votre contrôle OLE a été créé avec une version de Visual C++ antérieure à 4,2, il existe des actions que vous pouvez entreprendre pour améliorer ses performances et de tirer parti de ses fonctionnalités.Pour une description détaillée de ces derniers modifie, consultez Contrôles ActiveX : optimisation.

Si vous ajoutez une prise en charge asynchrone de propriété à un contrôle existant, vous devrez ajouter la propriété d'état prêt et l'événement d' ReadyStateChange vous-même.Dans le constructeur du contrôle, ajoutez :

m_lReadyState = READYSTATE_LOADING;

Mettez à jour l'état prêt comme votre code est téléchargé en appelant COleControl::InternalSetReadyState.Un emplacement que vous pouvez appeler InternalSetReadyState est de la substitution d' OnProgress d' CDataPathPropertyclasse dérivée de.

Ensuite, suivez les étapes de Créer un contrôle ActiveX.

Voir aussi

Concepts

Tâches de programmation Internet MFC

Concepts de programmation Internet MFC