Partager via


Contrôles ActiveX sur Internet

Les contrôles ActiveX sont la version mise à jour de la spécification de contrôle OLE.

Important

ActiveX est une technologie héritée qui ne doit pas être utilisée pour le nouveau développement. Pour plus d’informations, consultez Contrôles ActiveX.

Les contrôles sont une architecture primaire pour le développement de composants logiciels programmables qui peuvent être utilisés dans plusieurs conteneurs, y compris les navigateurs Web compatibles COM sur Internet. Un contrôle ActiveX peut être un contrôle Internet et peut ajouter ses fonctionnalités dans un document actif ou faire partie d'une page Web. Les contrôles sur une page Web peuvent communiquer entre eux à l'aide de scripts.

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

Les contrôles ActiveX présentent plusieurs avantages, notamment :

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

  • La possibilité d'être sans fenêtre et toujours actifs en place.

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

  • Prise en charge de l’interface IUnknown .

  • Être un objet COM.

  • Exportez DLLRegisterServer et DLLUnRegisterServer.

  • Prendre en charge des interfaces supplémentaires si nécessaires pour la fonctionnalité.

Adaptation de vos contrôles existants à Internet

Concevoir un contrôle qui fonctionne bien dans un environnement Internet nécessite de faire attention aux débits de transmission relativement faibles sur Internet. Vous pouvez utiliser les contrôles existants ; toutefois, vous devez effectuer certaines étapes pour réduire le nombre d'instructions et effectuer le téléchargement des propriétés de votre contrôle de manière asynchrone.

Pour améliorer les performances de vos contrôles, suivez ces recommandations en matière d'efficacité :

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

  • Déterminez comment un contrôle est instancié.

  • Soyez asynchrone ; ne retardez pas d'autres programmes.

  • Téléchargez les données par petits blocs.

    En téléchargeant des flux volumineux, tels que des fichiers bitmap ou des données vidéo, accédez aux données d'un contrôle en coopération avec le conteneur. Récupérez des données de façon incrémentielle ou progressive, en travaillant en coopération avec d'autres contrôles qui peuvent aussi récupérer des données. Ce code peut également être téléchargé de manière asynchrone.

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

  • Soyez aussi actif que possible au niveau de l'interface utilisateur.

  • Considérez la manière dont les données permanentes sont enregistrées, à la fois pour les propriétés et les importantes données BLOB (par exemple une image bitmap ou des données vidéo).

    Les contrôles avec des quantités importantes de données permanentes, telles que des fichiers bitmap ou AVI, requièrent une attention particulière à la méthode de téléchargement. Un document ou une page peut être visible dès que possible, et permet à l'utilisateur d'interagir avec la page lorsque les contrôles extraient des données en arrière-plan.

  • Entrez des routines efficaces pour réduire le nombre et l'exécution d'instructions.

    Les contrôles d'étiquette et de petits boutons, avec seulement quelques octets de données persistantes, conviennent pour une utilisation dans l'environnement Internet et fonctionnent correctement à l'intérieur des navigateurs.

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

    Informez le conteneur de la progression du téléchargement asynchrone, notamment lorsque l'utilisateur peut commencer à interagir avec une page, et si le téléchargement est terminé. Le conteneur peut afficher la progression à l'utilisateur, tels que les pourcentages atteints.

  • Déterminez comment les contrôles sont stockés sur l'ordinateur client.

Création d'un contrôle ActiveX

Lors de la création d'un contrôle avec l'Assistant Application, vous pouvez choisir d'activer la prise en charge des monikers asynchrones ainsi que des optimisations supplémentaires. Pour ajouter la prise en charge des propriétés de téléchargement asynchrone, procédez comme suit :

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

  1. Cliquez sur Nouveau dans le menu Fichier.

  2. Sélectionnez l’Assistant Contrôle ActiveX MFC dans les projets Visual Studio C++ et nommez votre projet.

  3. Dans la page Contrôle Paramètres, sélectionnez Charger les propriétés de manière asynchrone. Cette option configure 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 l’activation sans fenêtre, qui est décrite dans Les 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 de CDataPathProperty.

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

  3. Dans cette classe, remplacez OnDataAvailable. Cette fonction est appelée lorsque les données sont disponibles pour l'affichage. Lorsque des données deviennent disponibles, vous pouvez les gérer avec la méthode de votre choix, par exemple avec un affichage progressif.

    L'extrait de code ci-dessous est un exemple simple d'affichage progressif des données dans un contrôle d'édition. Notez l’utilisation de l’indicateur BSCF_FIRSTDATANOTIFICATION pour effacer 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 CListCtrl.

  4. Lorsque votre contrôle change d'état général (par exemple, de "en chargement" à "initialisé" ou "en interaction utilisateur"), appelez COleControl::InternalSetReadyState. Si votre contrôle n’a qu’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 est terminé. Par exemple :

    if (bscfFlag & BSCF_LASTDATANOTIFICATION)
    {
       GetControl()->InternalSetReadyState(READYSTATE_COMPLETE);
    }
    
  5. Remplacez OnProgress. Dans OnProgress, il vous est renvoyé un nombre qui indique la plage maximale et un nombre indiquant l'avancement du téléchargement en cours. Vous pouvez utiliser ces nombres pour afficher l'état, comme le pourcentage de progression.

La procédure suivante ajoute une propriété au contrôle pour utiliser uniquement la classe qui vient d'être dérivée.

Pour ajouter une propriété

  1. En mode Classe, cliquez avec le bouton droit sur l’interface sous le nœud de bibliothèque, puis sélectionnez Ajouter, puis Ajouter une propriété. Cela démarre l’Assistant Ajouter une propriété.

  2. Dans l’Assistant Ajouter une propriété, sélectionnez la case d’option Set/Get Methods, tapez le nom de la propriété, par exemple, EditControlText, puis sélectionnez BSTR comme type de propriété.

  3. Cliquez sur Terminer.

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

    CMyDataPathProperty EditControlText;
    
  5. Implémentez les méthodes Get/Set. Pour Get, 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. Remplacez ResetData pour avertir la propriété de réinitialiser son contrôle en ajoutant cette ligne :

    EditControlText.ResetData();
    

Choisir d'effectuer une dérivation à partir de CDataPathProperty ou de CCachedDataPathProperty

L'exemple précédent décrit les étapes pour dériver la propriété de votre contrôle à partir de CDataPathProperty. Il s'agit d'un bon choix si vous téléchargez des données en temps réel qui changent fréquemment, et pour lesquelles vous n'avez pas besoin de conserver toutes les données, mais uniquement la valeur actuelle. Par exemple, le contrôle de cotations boursières.

Vous pouvez également effectuer une dérivation à partir de CCachedDataPathProperty. Dans ce cas, les données téléchargées sont mises en cache dans un fichier de stockage. 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 image bitmap). Dans ce cas, la classe possède une variable membre contenant les données :

CMemFile m_Cache;

Dans votre classe de contrôle ActiveX, vous pouvez utiliser ce fichier mappé en mémoire dans OnDraw pour afficher les données. Dans votre classe de contrôle ActiveX dérivée CCachedDataPathProperty, 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();
}

Téléchargement de données en mode asynchrone à l'aide des contrôles ActiveX

Le téléchargement de données sur un réseau doit être effectué de manière asynchrone. L'avantage de cette opération est que si un grand nombre de données est transféré ou si la connexion est lente, l'opération de téléchargement ne bloquera pas d'autres processus exécutés sur le client.

Des monikers asynchrones permettent de télécharger les données sur un réseau en mode asynchrone. Une opération de lecture dans un moniker asynchrone retourne immédiatement le résultat, même si l'opération n'a pas été effectuée.

Par exemple, si seuls dix (10) octets sont disponibles et que la lecture est appelée de manière asynchrone dans un fichier de un (1) Ko, la lecture ne se bloquera pas, mais retournera les dix (10) octets disponibles.

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

Affichage d’un contrôle sur une page web

Voici un exemple de balise et d'attributs d'objet 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>

Mise à jour d’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 à la version 4.2, vous pouvez suivre certaines étapes pour améliorer ses performances et ses fonctionnalités. Pour une présentation détaillée de ces modifications, consultez Les contrôles ActiveX : Optimisation.

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

m_lReadyState = READYSTATE_LOADING;

Vous allez mettre à jour l’état prêt à mesure que votre code est téléchargé en appelant COleControl ::InternalSetReadyState. Un emplacement à partir duquel vous pouvez appeler InternalSetReadyState est depuis la substitution OnProgress de la classe dérivée de CDataPathProperty.

Voir aussi

Tâches de programmation Internet MFC
Notions de base de la programmation Internet MFC