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 :
Ajoutez du code à votre projet de contrôle.
Un ID de page de propriétés Picture standard, un membre de données de type
CPictureHolder
et une propriété personnalisée de type LPPICTUREDISP avec une implémentation de Get/Set doivent être ajoutés.Modifiez plusieurs fonctions dans votre classe de contrôle.
Ces modifications sont apportées à plusieurs fonctions qui sont responsables du dessin de votre contrôle ActiveX.
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é
Chargez votre projet de contrôle.
Dans l’Affichage de classes, développez le nœud Bibliothèque de votre contrôle.
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.
Dans le menu contextuel, choisissez Ajouter , puis Ajouter une propriété.
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.Dans la zone Type de propriété, sélectionnez IPictureDisp* pour le type de propriété.
Pour Type d’implémentation, cliquez sur Méthodes Get/Set.
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
etSetControlPicture
sont utilisés.)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
, OnDraw
et 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 COleControl
de 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