Partage via


Contrôles ActiveX MFC : utilisation d’images dans un contrôle ActiveX

Cet article décrit le type Picture courant et explique comment l’implémenter dans votre contrôle ActiveX. Les sujets abordés sont les suivants :

Vue d’ensemble des propriétés Picture personnalisées

Un type Picture est un groupe de types communs à certains contrôles ActiveX. Le type Picture gère des métafichiers, des bitmaps et des icônes, et permet à l’utilisateur de spécifier une image à afficher dans un contrôle ActiveX. Les propriétés Picture personnalisées sont implémentées en utilisant un objet Picture et des fonctions Get/Set qui permettent de contrôler l’accès utilisateur à la propriété Picture. Les utilisateurs du contrôle accèdent à la propriété Picture personnalisée via la page de propriétés Picture stock.

Outre le type Picture standard, les types Font et Color sont également disponibles. Pour plus d’informations sur l’utilisation du type Font standard dans votre contrôle ActiveX, consultez l’article Contrôles ActiveX MFC : utilisation des polices.

Les classes de contrôles ActiveX fournissent différents composants que vous pouvez utiliser pour implémenter la propriété Picture dans le contrôle. Ces composants incluent :

  • La classe CPictureHolder .

    Cette classe fournit un accès facile à l’objet Picture et les fonctionnalités pour l’élément affiché par la propriété Picture personnalisée.

  • Prise en charge des propriétés de type LPPICTUREDISP, implémentée avec les fonctions Get/Set.

    Grâce à l’Affichage de classes, vous pouvez rapidement ajouter une ou plusieurs propriétés personnalisées prenant en charge le type Picture. Pour plus d’informations sur l’ajout de propriétés de contrôle ActiveX avec l’Affichage de classes, consultez l’article Contrôles ActiveX MFC : propriétés.

  • Une page de propriétés qui permet de manipuler une ou plusieurs propriétés Picture d’un contrôle.

    Cette page de propriétés fait partie d’un groupe de pages de propriétés stock disponibles pour les contrôles ActiveX. Pour plus d’informations sur les pages de propriétés des contrôles ActiveX, consultez l’article Contrôles ActiveX MFC : utilisation des pages de propriétés stock.

Implémentation d’une propriété Picture personnalisée dans votre contrôle ActiveX

Quand vous avez terminé les étapes décrites dans cette section, le contrôle peut afficher les images choisies par son utilisateur. L’utilisateur peut modifier l’image affichée à l’aide d’une page de propriétés qui affiche l’image actuelle et qui comporte un bouton Parcourir permettant à l’utilisateur de sélectionner d’autres images.

Une propriété Picture personnalisée est implémentée selon un processus similaire à celui utilisée pour l’implémentation d’autres propriétés, la principale différence étant que la propriété personnalisée doit prendre en charge un type Picture. Étant donné que l’élément de la propriété Picture doit être dessiné par le contrôle ActiveX, un certain nombre d’ajouts et de modifications doivent être effectués sur la propriété avant qu’elle puisse être entièrement implémentée.

Pour implémenter une propriété Picture personnalisée, vous devez procéder comme suit :

Ajouts à votre projet de contrôle

Pour ajouter l’ID de page de propriétés de la page de propriétés Image standard, insérez la ligne suivante après la macro BEGIN_PROPPAGEIDS dans le fichier d’implémentation de contrôle (. CPP) :

PROPPAGEID(CLSID_CPicturePropPage)

Vous devez également incrémenter le paramètre count de votre macro BEGIN_PROPPAGEIDS par un. La ligne suivante le montre :

BEGIN_PROPPAGEIDS(CMyAxPicCtrl, 2)

Pour ajouter le membre de données CPictureHolder à la classe de contrôle, insérez la ligne suivante sous la section protégée de la déclaration de la classe de contrôle dans le fichier d’en-tête du contrôle (.H) :

CPictureHolder    m_pic;

Il n’est pas nécessaire de nommer votre membre de données m_pic ; tout nom suffit.

Ensuite, ajoutez une propriété personnalisée qui prend en charge un type Picture :

Pour ajouter une propriété Picture personnalisée à l’aide de l’Assistant Ajout de 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, choisissez Ajouter , puis Ajouter une propriété.

  5. Dans la zone Nom de la propriété , tapez le nom de la propriété. À titre d’exemple, ControlPicture est utilisé dans cette procédure.

  6. Dans la zone Type de propriété, sélectionnez IPictureDisp* pour le type de propriété.

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

  8. Tapez un nom unique pour vos fonctions Get et Set, ou acceptez les noms par défaut. (Dans cet exemple, les noms par défaut GetControlPicture et SetControlPicture sont utilisés.)

  9. Cliquez sur Terminer.

L’Assistant Ajout de propriété ajoute le code suivant entre les commentaires de la table de dispatch dans le fichier d’en-tête (.H) du contrôle :

IPictureDisp* GetControlPicture(void);
void SetControlPicture(IPictureDisp* pVal);

En outre, le code suivant a été inséré dans la table de dispatch du fichier d’implémentation (.CPP) du contrôle :

DISP_PROPERTY_EX_ID(CMyAxPicCtrl, "ControlPicture", dispidControlPicture,
   GetControlPicture, SetControlPicture, VT_PICTURE)

L’Assistant Ajout de propriété ajoute également les deux fonctions stub suivantes dans le fichier d’implémentation du contrôle :

IPictureDisp* CWizardGenCtrl::GetControlPicture(void)
{
   AFX_MANAGE_STATE(AfxGetStaticModuleState());

   // TODO: Add your dispatch handler code here

   return NULL;
}

void CWizardGenCtrl::SetControlPicture(IPictureDisp* /*pVal*/)
{
   AFX_MANAGE_STATE(AfxGetStaticModuleState());

   // TODO: Add your property handler code here

   SetModifiedFlag();
}

Remarque

Les noms de la classe et des fonctions de votre contrôle peuvent différer de l’exemple ci-dessus.

Modifications de votre projet de contrôle

Après avoir effectué les ajouts nécessaires au projet de contrôle, vous devez modifier plusieurs fonctions qui affectent le rendu de votre contrôle ActiveX. Ces fonctions, OnResetState, OnDrawet les fonctions Get/Set d’une propriété Picture personnalisée, se trouvent dans le fichier d’implémentation du contrôle. (Notez que dans cet exemple, la classe de contrôle est appelée CSampleCtrl, le CPictureHolder membre de données est appelé m_pic et le nom de la propriété image personnalisée est ControlPicture.)

Dans la fonction OnResetState du contrôle, ajoutez la ligne facultative suivante après l’appel à COleControl::OnResetState:

m_pic.CreateEmpty();
m_pic.CreateEmpty();

Ceci définit l’image du contrôle sur une image vide.

Pour dessiner l’image correctement, effectuez un appel à CPictureHolder::Render dans la fonction OnDraw du contrôle. Modifier votre fonction de façon à ce qu’elle ressemble à l’exemple suivant :

void CMyAxPicCtrl::OnDraw(CDC* pdc, const CRect& rcBounds, const CRect& /*rcInvalid*/)
{
   if (!pdc)
      return;

   m_pic.Render(pdc, rcBounds, rcBounds);
}

Dans la fonction Get de la propriété Picture personnalisée du contrôle, ajoutez la ligne suivante :

return m_pic.GetPictureDispatch();
return m_pic.GetPictureDispatch();

Dans la fonction Get de la propriété Picture personnalisée du contrôle, ajoutez les lignes suivantes :

m_pic.SetPictureDispatch(pVal);
InvalidateControl();

La propriété Picture doit être rendue persistante, pour que les informations ajoutées au moment de la conception s’affichent au moment de l’exécution. Ajoutez la ligne suivante à la fonction COleControlde la classe dérivée de DoPropExchange :

PX_Picture(pPX, _T("ControlPicture"), m_pic);

Remarque

Les noms de votre classe et de vos fonctions peuvent différer de l’exemple ci-dessus.

Une fois les modifications terminées, régénérez votre projet pour incorporer les nouvelles fonctionnalités de la propriété Picture personnalisée et utilisez le conteneur de test pour tester la nouvelle propriété. Pour plus d’informations sur la façon d’accéder au conteneur de test, consultez la page Test des propriétés et des événements avec le conteneur de test .

Voir aussi

Contrôles ActiveX MFC
Contrôles ActiveX MFC : utilisation des polices
Contrôles ActiveX MFC : pages de propriétés