Partager via


Contrôles ActiveX MFC : Rubriques avancées

Cet article présente les rubriques avancées relatives à développer des contrôles ActiveX.Ces niveaux sont les suivants :

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

  • Implémenter une propriété paramétrée

  • Gestion des erreurs dans votre contrôle ActiveX

  • Clés spéciale de gestion dans le contrôle

  • Contrôles de boîte de dialogue accès invisibles au moment de l'exécution

Utilisation des 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 à développer des contrôles ActiveX qui utilisent les classes de base de données MFC.

Pour une vue d'ensemble des classes de base de données MFC, consultez Classes de base de données MFC (DAO et ODBC).L'article présente les classes ODBC MFC et les classes DAO MFC et vous conduit à plus de détails sur l'un ou l'autre.

[!REMARQUE]

Dans Visual C++ .NET, les Assistants et l'environnement Visual C++ ne prennent plus en charge DAO (même si les classes DAO sont incluses et que vous pouvez toujours les utiliser).Microsoft recommande l'utilisation Modèles OLE DB ou ODBC et MFC pour les nouveaux projets.Vous ne devez utiliser DAO que dans les applications existantes.

Implémenter une propriété paramétrée

Une propriété paramétrée (parfois appelée un tableau de propriété) est une méthode pour exposer une collection homogène de valeurs comme une propriété unique du contrôle.Par exemple, vous pouvez utiliser une propriété paramétrée pour exposer un tableau ou un dictionnaire en tant que propriété.En 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 Ajout de propriété pour implémenter une propriété paramétrée.L'Assistant Ajout de propriété implémente la propriété en ajoutant une paire de fonctions get/set qui permettent à l'utilisateur de contrôle pour accéder à la propriété à l'aide de la notation ci-dessus ou de la façon standard.

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

La procédure suivante ajoute une propriété paramétrée, appelée tableau, qui est accessible comme tableau à deux dimensions d'entiers.

Pour ajouter une propriété paramétrée l'Assistant Ajout de propriété

  1. Chargez le projet de votre contrôle.

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

  3. Cliquez avec le bouton droit sur le nœud de l'interface pour votre contrôle (le deuxième nœud du nœud de bibliothèque) pour ouvrir le menu contextuel.

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

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

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

  7. Pour le type de Implémentation , cliquez sur Get/Set Methods.

  8. Dans les zones de Get Function et de Fonction Set , entrez les noms uniques pour votre get et fonctions définies ou acceptez les noms par défaut.

  9. Ajoutez un paramètre, row appelé (type short), à l'aide de les contrôles de Nom du paramètre et de Type de paramètre .

  10. Ajoutez column appelé par le deuxième paramètre (type short).

  11. Cliquez sur Terminer.

2dffbw6e.collapse_all(fr-fr,VS.110).gifModifications effectuées par l'Assistant Ajout de propriété

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

Les lignes suivantes sont ajoutées à la classe de contrôle. fichier de 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 en accédant à la propriété.

En outre, l'Assistant Ajout de propriété ajoute les lignes suivantes à la table de dispatch de contrôle, située dans le fichier de contrôle de l'implémentation de classe (.CPP) :

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

Enfin, des implémentations d' GetArray et des fonctions d' SetArray sont ajoutées à la fin de le fichier .cpp.Dans la plupart des cas, vous modifierez le fonction d'obtention pour retourner la valeur de la propriété.La fonction définie contient généralement du code qui doit être exécuté, soit avant ou après que la propriété change.

Pour que cette propriété soit utile, vous pouvez déclarer une variable membre de tableau à deux dimensions dans la classe de contrôle, du type short, de stocker des valeurs pour la propriété paramétrée.Vous pouvez ensuite modifier la fonction d'obtention pour retourner la valeur enregistrée sur la ligne et colonne appropriées, comme indiqué par les paramètres, puis remplacez la fonction définie 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 les 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 les erreurs, selon la situation dans laquelle l'erreur se produit.Si l'erreur se produit dans la fonction get ou de l'ensemble d'une propriété, ou dans l'implémentation d'une méthode OLE Automation, le contrôle doit appeler COleControl::ThrowError, qui signale à l'utilisateur de contrôle qu'une erreur s'est produite.Si l'erreur survient à un autre point, le contrôle doit appeler COleControl::FireError, qui déclenche des événements d'erreurs boursières.

Pour indiquer le type d'erreur qui s'est produit, le contrôle doit passer un code d'erreur à ThrowError ou à FireError.Code d'erreur est OLE code d'état, qui a une valeur 32 bits.Si possible, choisissez un code d'erreur du jeu standard de codes définis dans le fichier d'en-tête OLECTL.H.Le tableau suivant récapitule ces codes.

Codes d'erreur de contrôle ActiveX

Erreur

Description

CTL_E_ILLEGALFUNCTIONCALL

Appel de fonction non conforme

CTL_E_OVERFLOW

Dépassement de capacité

CTL_E_OUTOFMEMORY

Mémoire insuffisante

CTL_E_DIVISIONBYZERO

Division par zéro

CTL_E_OUTOFSTRINGSPACE

Hors de l'espace de chaîne

CTL_E_OUTOFSTACKSPACE

Hors de l'espace de pile

CTL_E_BADFILENAMEORNUMBER

Incorrect nom de fichier ou nombre

CTL_E_FILENOTFOUND

Fichier introuvable

CTL_E_BADFILEMODE

Incorrect mode d'accès au fichier

CTL_E_FILEALREADYOPEN

Fichier est ouvert

CTL_E_DEVICEIOERROR

Erreur d'E/S du périphérique

CTL_E_FILEALREADYEXISTS

Le fichier existe déjà

CTL_E_BADRECORDLENGTH

Incorrecte longueur d'enregistrement

CTL_E_DISKFULL

Disque plein

CTL_E_BADRECORDNUMBER

Incorrect numéro d'enregistrement

CTL_E_BADFILENAME

Incorrect nom de fichier

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

Chemin d'accès/erreur d'accès au fichier

CTL_E_PATHNOTFOUND

Chemin d'accès introuvable

CTL_E_INVALIDPATTERNSTRING

Chaîne valide de modèle

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 non valide de tableau de propriétés

CTL_E_SETNOTSUPPORTEDATRUNTIME

Ensemble non pris en charge au moment de l'exécution

CTL_E_SETNOTSUPPORTED

Ensemble non pris en charge (propriété en lecture seule)

CTL_E_NEEDPROPERTYARRAYINDEX

Index de tableau de propriétés du besoin

CTL_E_SETNOTPERMITTED

Ensemble 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 de presse-papiers valide

CTL_E_INVALIDPICTURE

Image valide

CTL_E_PRINTERERROR

Erreur d'imprimante

CTL_E_CANTSAVEFILETOTEMP

Ne peut pas enregistrer le fichier dans la température

CTL_E_SEARCHTEXTNOTFOUND

Texte recherché introuvable

CTL_E_REPLACEMENTSTOOLONG

Remplacements trop long

Si nécessaire, utilisez la macro de CUSTOM_CTL_SCODE pour définir un code d'erreur personnalisé pour un composant qui n'est pas couverte par un de codes standard.Le paramètre pour 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 existant de VBX, définissez les codes d'erreur de contrôle ActiveX avec les mêmes valeurs numériques que le contrôle de VBX l'utilise pour s'assurer que les codes d'erreur sont compatibles.

Clés spéciale de gestion dans le contrôle

Dans certains cas vous pouvez gérer certaines combinaisons de touches d'une méthode spéciale ; par exemple, insérez une nouvelle ligne lorsque la touche Entrée est enfoncée un contrôle de zone de texte ou un déplacement multiligne entre un groupe de contrôles d'édition lorsqu'un identificateur de clé directionnel enfoncé.

Si la classe de base de votre contrôle ActiveX est COleControl, vous pouvez substituer CWnd::PreTranslateMessage de traiter des messages avant que le conteneur les traite.Lors de l'utilisation de cette technique, TRUE toujours de retour si vous traitez le message dans la substitution d' PreTranslateMessage.

L'exemple de code suivant montre une façon possible de gérer tous les messages liés aux touches de direction.

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 du clavier interfaces pour un contrôle ActiveX, consultez la documentation ActiveX Kit de développement logiciel.

Contrôles de boîte de dialogue accès invisibles au moment de l'exécution

Vous pouvez créer les contrôles de boîte de dialogue n'ont aucune interface utilisateur et sont invisibles au moment de l'exécution.Si vous ajoutez au moment de l'exécution d'un contrôle ActiveX invisible à une boîte de dialogue et 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'Assistant Ajout de variable membre, sélectionnez Control Variable puis sélectionnez l'ID du contrôleEntrez 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 en tant qu'élément de dialogue.Insérez le code similaire au code suivant (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

Concepts

Contrôles ActiveX MFC