Conteneurs de contrôles ActiveX : programmation de contrôles ActiveX dans un conteneur de contrôles ActiveX
Cet article décrit le processus d’accès aux méthodes et propriétés exposées des contrôles ActiveX incorporés.
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.
En fait, vous allez suivre ces étapes :
Insérez un contrôle ActiveX dans le projet de conteneur ActiveX à l’aide de Gallery.
Définissez une variable membre (ou une autre forme d’accès) du même type que la classe wrapper de contrôle ActiveX.
Programmez le contrôle ActiveX à l’aide de fonctions membres prédéfinies de la classe wrapper.
Pour cette discussion, supposons que vous avez créé un projet basé sur des dialogues (nommé Conteneur) avec la prise en charge du contrôle ActiveX. L’exemple de contrôle Circ, Circ, sera ajouté au projet résultant.
Une fois le contrôle Circ inséré dans le projet (étape 1), insérez une instance du contrôle Circ dans la boîte de dialogue principale de l’application.
Procédures
Pour ajouter le contrôle Circ au modèle de boîte de dialogue
Chargez le projet de conteneur de contrôle ActiveX. Pour cet exemple, utilisez le
Container
projet.Cliquez sur l’onglet Affichage des ressources.
Ouvrez le dossier boîte de dialogue .
Double-cliquez sur le modèle de boîte de dialogue principale. Pour cet exemple, utilisez IDD_CONTAINER_DIALOG.
Cliquez sur l’icône de contrôle Circ dans la boîte à outils.
Cliquez sur un emplacement dans la boîte de dialogue pour insérer le contrôle Circ.
Dans le menu Fichier , choisissez Enregistrer tout pour enregistrer toutes les modifications apportées au modèle de boîte de dialogue.
Modifications apportées au projet
Pour permettre à l’application conteneur d’accéder au contrôle Circ, Visual C++ ajoute automatiquement le fichier d’implémentation de la classe wrapper (CCirc
). CPP) vers le projet conteneur et l’en-tête de classe wrapper (. Fichier H) dans le fichier d’en-tête de la boîte de dialogue :
#include "circ.h"
En-tête de classe Wrapper (. Fichier H)
Pour obtenir et définir des propriétés (et appeler des méthodes) pour le contrôle Circ, la CCirc
classe wrapper fournit une déclaration de toutes les méthodes et propriétés exposées. Dans l’exemple, ces déclarations se trouvent dans CIRC.H. L’exemple suivant est la partie de la classe CCirc
qui définit les interfaces exposées du contrôle ActiveX :
class CCirc : public CWnd
{
// Functions
//
void AboutBox()
{
InvokeHelper(DISPID_ABOUTBOX, DISPATCH_METHOD, VT_EMPTY, NULL, NULL);
}
// Properties
//
unsigned long GetBackColor()
{
unsigned long result;
GetProperty(DISPID_BACKCOLOR, VT_UI4, (void*)& result);
return result;
}
void SetBackColor(unsigned long propVal)
{
SetProperty(DISPID_BACKCOLOR, VT_UI4, propVal);
}
signed char GetCircleShape()
{
signed char result;
GetProperty(0x1, VT_I1, (void*)& result);
return result;
}
void SetCircleShape(signed char propVal)
{
SetProperty(0x1, VT_I1, propVal);
}
short GetCircleOffset()
{
short result;
GetProperty(0x3, VT_I2, (void*)& result);
return result;
}
void SetCircleOffset(short propVal)
{
SetProperty(0x3, VT_I2, propVal);
}
CString GetCaption()
{
CString result;
GetProperty(DISPID_CAPTION, VT_BSTR, (void*)& result);
return result;
}
void SetCaption(CString propVal)
{
SetProperty(DISPID_CAPTION, VT_BSTR, propVal);
}
COleFont GetFont()
{
LPDISPATCH result;
GetProperty(DISPID_FONT, VT_DISPATCH, (void*)& result);
return COleFont(result);
}
void SetFont(LPDISPATCH propVal)
{
SetProperty(DISPID_FONT, VT_DISPATCH, propVal);
}
unsigned long GetForeColor()
{
unsigned long result;
GetProperty(DISPID_FORECOLOR, VT_UI4, (void*)& result);
return result;
}
void SetForeColor(unsigned long propVal)
{
SetProperty(DISPID_FORECOLOR, VT_UI4, propVal);
}
CString GetNote()
{
CString result;
GetProperty(0x4, VT_BSTR, (void*)& result);
return result;
}
void SetNote(CString propVal)
{
SetProperty(0x4, VT_BSTR, propVal);
}
unsigned long GetFlashColor()
{
unsigned long result;
GetProperty(0x2, VT_UI4, (void*)& result);
return result;
}
void SetFlashColor(unsigned long propVal)
{
SetProperty(0x2, VT_UI4, propVal);
}
};
Ces fonctions peuvent ensuite être appelées à partir d’autres procédures de l’application à l’aide de la syntaxe C++ normale. Pour plus d’informations sur l’utilisation de ce jeu de fonctions membres pour accéder aux méthodes et propriétés du contrôle, consultez la section Programmation du contrôle ActiveX.
Modifications des variables membres dans le projet
Une fois le contrôle ActiveX ajouté au projet et incorporé dans un conteneur de boîte de dialogue, il est accessible par d’autres parties du projet. Le moyen le plus simple d’accéder au contrôle consiste à créer une variable membre de la classe de dialogue ( CContainerDlg
étape 2), qui est du même type que la classe wrapper ajoutée au projet par Visual C++. Vous pouvez ensuite utiliser la variable membre pour accéder au contrôle incorporé à tout moment.
Lorsque la boîte de dialogue Ajouter une variable membre ajoute la variable membre m_circctl au projet, elle ajoute également les lignes suivantes au fichier d’en-tête (. H) de la CContainerDlg
classe :
class CContainerDlg : public CDialog
{
DECLARE_DYNAMIC(CContainerDlg)
public:
CContainerDlg(CWnd* pParent = NULL); // standard constructor
virtual ~CContainerDlg();
virtual void OnFinalRelease();
// Dialog Data
enum { IDD = IDD_CONTAINER_DIALOG };
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
DECLARE_MESSAGE_MAP()
DECLARE_DISPATCH_MAP()
DECLARE_INTERFACE_MAP()
public:
CCirc m_circctl;
};
En outre, un appel à DDX_Control est automatiquement ajouté à l’implémentation CContainerDlg
de DoDataExchange
:
DDX_Control(pDX, IDC_CIRCCTRL1, m_circctl);
Programmation du contrôle ActiveX
À ce stade, vous avez inséré le contrôle ActiveX dans votre modèle de boîte de dialogue et créé une variable membre pour celle-ci. Vous pouvez maintenant utiliser la syntaxe C++ commune pour accéder aux propriétés et méthodes du contrôle incorporé.
Comme indiqué (dans l’en-tête de classe Wrapper (. Fichier H), fichier d’en-tête (. H) pour la CCirc
classe wrapper, dans ce cas CIRC. H, contient une liste de fonctions membres que vous pouvez utiliser pour obtenir et définir n’importe quelle valeur de propriété exposée. Les fonctions membres pour les méthodes exposées sont également disponibles.
Un endroit courant pour modifier les propriétés du contrôle se trouve dans la OnInitDialog
fonction membre de la classe de dialogue principale. Cette fonction est appelée juste avant l’affichage de la boîte de dialogue et est utilisée pour initialiser son contenu, y compris l’un de ses contrôles.
L’exemple de code suivant utilise la variable membre m_circctl pour modifier les propriétés Caption et CircleShape du contrôle Circ incorporé :
BOOL CContainerDlg::OnInitDialog()
{
CDialog::OnInitDialog();
m_circctl.SetCaption(_T("Circ 2 Control"));
if (!m_circctl.GetCircleShape())
m_circctl.SetCircleShape(TRUE);
return TRUE; // return TRUE unless you set the focus to a control
}