Partager via


Contrôles ActiveX MFC : rubriques avancées

Cet article traite des rubriques avancées relatives au développement de contrôles ActiveX. Il s’agit notamment des paramètres suivants :

Important

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

Utilisation de classes de base de données dans des contrôles ActiveX

Étant donné que les classes de contrôle ActiveX font partie de la bibliothèque de classes, vous pouvez appliquer les mêmes procédures et règles d’utilisation des classes de base de données dans une application MFC standard pour développer des contrôles ActiveX qui utilisent les classes de base de données MFC.

Pour obtenir une vue d’ensemble générale des classes de base de données MFC, consultez les classes de base de données MFC (DAO et ODBC). L’article présente à la fois les classes ODBC MFC et les classes DAO MFC et vous dirige vers plus de détails sur l’une ou l’autre.

Remarque

DAO est pris en charge par Bureau 2013. DAO 3.6 est la version finale, et elle est considérée comme obsolète. L’environnement et les Assistants Visual C++ ne prennent pas en charge DAO (bien que les classes DAO soient incluses et que vous pouvez toujours les utiliser). Microsoft vous recommande d’utiliser des modèles OLE DB ou ODBC et MFC pour de nouveaux projets. Vous devez uniquement utiliser DAO pour gérer les applications existantes.

Implémentation d’une propriété paramétrable

Une propriété paramétrable (parfois appelée tableau de propriétés) est une méthode permettant d’exposer une collection homogène de valeurs en tant que propriété unique du contrôle. Par exemple, vous pouvez utiliser une propriété paramétrable pour exposer un tableau ou un dictionnaire en tant que propriété. Dans Visual Basic, une telle propriété est accessible à l’aide de la notation de tableau :

x = o.Array(2, 3) ' gets element of 2D array
o.Array(2, 3) = 7 ' sets element of 2D array

Utilisez l’Assistant Ajouter une propriété pour implémenter une propriété paramétrable. L’Assistant Ajouter une propriété implémente la propriété en ajoutant une paire de fonctions Get/Set qui permettent à l’utilisateur de contrôle d’accéder à la propriété à l’aide de la notation ci-dessus ou de la manière standard.

À l’instar des méthodes et des propriétés, les propriétés paramétrables ont également une limite au nombre de paramètres autorisés. Dans le cas des propriétés paramétrables, la limite est de 15 paramètres (avec un paramètre réservé pour le stockage de la valeur de propriété).

La procédure suivante ajoute une propriété paramétrable, appelée Array, accessible en tant que tableau à deux dimensions d’entiers.

Pour ajouter une propriété paramétrable à l’aide de l’Assistant Ajouter une propriété

  1. Chargez votre projet de contrôle.

  2. Dans l’Affichage de classes, développez le nœud Bibliothèque de votre contrôle.

  3. Cliquez sur le nœud Interface de votre contrôle (le deuxième nœud du nœud Bibliothèque) pour ouvrir le menu contextuel.

  4. Dans le menu contextuel, cliquez sur Ajouter , puis sur Ajouter une propriété.

  5. Dans la zone Nom de la propriété, tapez Array.

  6. Dans la zone Type de propriété, sélectionnez short.

  7. Pour Type d’implémentation, cliquez sur Méthodes Get/Set.

  8. Dans les zones Obtenir la fonction et définir la fonction, tapez des noms uniques pour vos fonctions Get et Set ou acceptez les noms par défaut.

  9. Ajoutez un paramètre, appelé ligne (type court), à l’aide des contrôles Nom du paramètre et Type de paramètre.

  10. Ajoutez un deuxième paramètre appelé colonne (type short).

  11. Cliquez sur Terminer.

Modifications apportées par l’Assistant Ajouter une propriété

Lorsque vous ajoutez une propriété personnalisée, l’Assistant Ajouter une propriété apporte des modifications à l’en-tête de classe de contrôle (. H) et l’implémentation (. Fichiers CPP.

Les lignes suivantes sont ajoutées à la classe de contrôle . Fichier H :

SHORT GetArray(SHORT row, SHORT column);
void SetArray(SHORT row, SHORT column, SHORT newVal);

Ce code déclare deux fonctions appelées GetArray et SetArray qui permettent à l’utilisateur de demander une ligne et une colonne spécifiques lors de l’accès à la propriété.

En outre, l’Assistant Ajouter une propriété ajoute les lignes suivantes à la carte de répartition du contrôle, située dans l’implémentation de la classe de contrôle (. Fichier CPP) :

DISP_PROPERTY_PARAM_ID(CMyAxUICtrl, "Array", dispidArray, GetArray, SetArray, VT_I2, VTS_I2 VTS_I2)

Enfin, les implémentations des fonctions et SetArray des GetArray fonctions sont ajoutées à la fin du . Fichier CPP. Dans la plupart des cas, vous allez modifier la fonction Get pour retourner la valeur de la propriété. La fonction Set contient généralement du code qui doit s’exécuter, avant ou après la modification de la propriété.

Pour que cette propriété soit utile, vous pouvez déclarer une variable membre de tableau à deux dimensions dans la classe de contrôle, de type short, pour stocker des valeurs pour la propriété paramétrable. Vous pouvez ensuite modifier la fonction Get pour retourner la valeur stockée à la ligne et à la colonne appropriée, comme indiqué par les paramètres, et modifier la fonction Set pour mettre à jour la valeur référencée par les paramètres de ligne et de colonne.

Gestion des erreurs dans votre contrôle ActiveX

Si des conditions d’erreur se produisent dans le contrôle, vous devrez peut-être signaler l’erreur au conteneur de contrôle. Il existe deux méthodes pour signaler des erreurs, en fonction de la situation dans laquelle l’erreur se produit. Si l’erreur se produit dans la fonction Get ou Set d’une propriété ou dans l’implémentation d’une méthode OLE Automation, le contrôle doit appeler COleControl ::ThrowError, ce qui signale à l’utilisateur de contrôle qu’une erreur s’est produite. Si l’erreur se produit à tout autre moment, le contrôle doit appeler COleControl ::FireError, ce qui déclenche un événement d’erreur de stock.

Pour indiquer le type d’erreur qui s’est produite, le contrôle doit transmettre un code d’erreur à ThrowError ou FireError. Un code d’erreur est un code d’état OLE, qui a une valeur 32 bits. Si possible, choisissez un code d’erreur à partir de l’ensemble standard de codes défini dans L’OLECTL. Fichier d’en-tête H. Le tableau suivant récapitule ces codes.

Codes d’erreur du contrôle ActiveX

Error Description
CTL_E_ILLEGALFUNCTIONCALL Appel de fonction illégal
CTL_E_OVERFLOW Dépassement
CTL_E_OUTOFMEMORY Mémoire insuffisante
CTL_E_DIVISIONBYZERO Division par zéro
CTL_E_OUTOFSTRINGSPACE Espace de chaîne insuffisant
CTL_E_OUTOFSTACKSPACE Espace de pile insuffisant
CTL_E_BADFILENAMEORNUMo ER Nom ou numéro de fichier incorrect
CTL_E_FILENOTFOUND Fichier introuvable
CTL_E_BADFILEMODE Mode de fichier incorrect
CTL_E_FILEALREADYOPEN Le fichier est déjà ouvert.
CTL_E_DEVICEIOERROR Erreur d'E/S de périphérique
CTL_E_FILEALREADYEXISTS Le fichier existe déjà
CTL_E_BADRECORDLENGTH Longueur d'enregistrement incorrecte
CTL_E_DISKFULL Disque plein
CTL_E_BADRECORDNUMo ER Numéro d'enregistrement incorrect
CTL_E_BADFILENAME Nom de fichier incorrect
CTL_E_TOOMANYFILES Trop de fichiers
CTL_E_DEVICEUNAVAILABLE Périphérique non disponible
CTL_E_PERMISSIONDENIED Autorisation refusée
CTL_E_DISKNOTREADY Disque non prêt
CTL_E_PATHFILEACCESSERROR Erreur d’accès au chemin/fichier
CTL_E_PATHNOTFOUND Chemin d'accès introuvable
CTL_E_INVALIDPATTERNSTRING Chaîne de modèle non valide
CTL_E_INVALIDUSEOFNULL Utilisation non valide de NULL
CTL_E_INVALIDFILEFORMAT Format de fichier non valide
CTL_E_INVALIDPROPERTYVALUE Valeur de propriété non valide
CTL_E_INVALIDPROPERTYARRAYINDEX Index de tableau de propriétés non valide
CTL_E_SETNOTSUPPORTEDATRUNTIME Set non pris en charge au moment de l’exécution
CTL_E_SETNOTSUPPORTED Set non pris en charge (propriété en lecture seule)
CTL_E_NEEDPROPERTYARRAYINDEX Index de tableau de propriétés requis
CTL_E_SETNOTPERMITTED Set non autorisé
CTL_E_GETNOTSUPPORTEDATRUNTIME Get non pris en charge au moment de l’exécution
CTL_E_GETNOTSUPPORTED Get non pris en charge (propriété en écriture seule)
CTL_E_PROPERTYNOTFOUND Propriété introuvable
CTL_E_INVALIDCLIPBOARDFORMAT Format du Presse-papiers non valide
CTL_E_INVALIDPICTURE Image non valide
CTL_E_PRINTERERROR Erreur d'imprimante
CTL_E_CANTSAVEFILETOTEMP Impossible d’enregistrer le fichier dans TEMP
CTL_E_SEARCHTEXTNOTFOUND Texte recherché introuvable
CTL_E_REPLACEMENTSTOOLONG Remplacements trop longs

Si nécessaire, utilisez la macro CUSTOM_CTL_SCODE pour définir un code d’erreur personnalisé pour une condition qui n’est pas couverte par l’un des codes standard. Le paramètre de cette macro doit être un entier compris entre 1000 et 32767, inclus. Par exemple :

#define MYCTL_E_SPECIALERROR CUSTOM_CTL_SCODE(1000)

Si vous créez un contrôle ActiveX pour remplacer un contrôle VBX existant, définissez vos codes d’erreur de contrôle ActiveX avec les mêmes valeurs numériques que celles utilisées par le contrôle VBX pour vous assurer que les codes d’erreur sont compatibles.

Gestion des clés spéciales dans le contrôle

Dans certains cas, vous souhaiterez peut-être gérer certaines combinaisons de touches d’une manière spéciale ; par exemple, insérez une nouvelle ligne lorsque la touche Entrée est enfoncée dans un contrôle de zone de texte multiligne ou passez d’un groupe de contrôles d’édition lorsqu’un ID de touche directionnelle est enfoncé.

Si la classe de base de votre contrôle ActiveX est COleControl, vous pouvez remplacer CWnd ::P reTranslateMessage pour gérer les messages avant que le conteneur les traite. Lorsque vous utilisez cette technique, retournez toujours TRUE si vous gérez le message dans votre remplacement.PreTranslateMessage

L’exemple de code suivant illustre un moyen possible de gérer tous les messages liés aux clés directionnelles.

BOOL CMyAxUICtrl::PreTranslateMessage(MSG* pMsg)
{
   BOOL bHandleNow = FALSE;

   switch (pMsg->message)
   {
   case WM_KEYDOWN:
      switch (pMsg->wParam)
      {
      case VK_UP:
      case VK_DOWN:
      case VK_LEFT:
      case VK_RIGHT:
         bHandleNow = TRUE;
         break;
      }
      if (bHandleNow)
      {
         OnKeyDown((UINT)pMsg->wParam, LOWORD(pMsg->lParam), HIWORD(pMsg->lParam));
      }
      break;
   }
   return bHandleNow;
}

Pour plus d’informations sur la gestion des interfaces clavier pour un contrôle ActiveX, consultez la documentation du Kit de développement logiciel (SDK) ActiveX.

Accès aux contrôles de boîte de dialogue invisibles au moment de l’exécution

Vous pouvez créer des contrôles de boîte de dialogue qui n’ont aucune interface utilisateur et qui sont invisibles au moment de l’exécution. Si vous ajoutez un contrôle ActiveX invisible au moment de l’exécution à une boîte de dialogue et que vous utilisez CWnd ::GetDlgItem pour accéder au contrôle, le contrôle ne fonctionnera pas correctement. Au lieu de cela, vous devez utiliser l’une des techniques suivantes pour obtenir un objet qui représente le contrôle :

  • À l’aide de l’Assistant Ajouter une variable de membre, sélectionnez Variable de contrôle, puis sélectionnez l’ID du contrôle. Entrez un nom de variable membre et sélectionnez la classe wrapper du contrôle comme type de contrôle.

    -ou-

  • Déclarez une variable locale et une sous-classe comme élément de boîte de dialogue. Insérer du code semblable à ce qui suit (CMyCtrl est la classe wrapper, IDC_MYCTRL1 est l’ID du contrôle) :

    CCirc myCirc;
    myCirc.SubclassDlgItem(IDC_CIRCCTRL2, this);
    // ... use myCirc ...
    myCirc.UnsubclassWindow();
    

Voir aussi

Contrôles ActiveX MFC