Compartir a través de


Contenedores de controles ActiveX: Programar controles ActiveX en un contenedor de controles ActiveX

En este artículo se describe el proceso para acceder a los métodos y propiedades expuestos de los controles ActiveX insertados.

Importante

ActiveX es una tecnología heredada que no se debe usar para el nuevo desarrollo. Para más información sobre las tecnologías modernas que reemplazan a ActiveX, vea Controles ActiveX.

Básicamente, seguirá estos pasos:

  1. Insertar un control ActiveX en el proyecto de contenedor ActiveX mediante la Galería.

  2. Definir una variable de miembro (u otra forma de acceso) del mismo tipo que la clase contenedora del control ActiveX.

  3. Programar el control ActiveX mediante funciones de miembro predefinidas de la clase contenedora.

En esta explicación, supongamos que ha creado un proyecto basado en cuadros de diálogo (denominado Contenedor) con compatibilidad con el control ActiveX. El control de ejemplo Circ se agregará al proyecto resultante.

Una vez insertado el control Circ en el proyecto (paso 1), inserte una instancia del control Circ en el cuadro de diálogo principal de la aplicación.

Procedimientos

Incorporación del control Circ a la plantilla de cuadro de diálogo

  1. Cargue el proyecto de contenedor del control ActiveX. Para este ejemplo, use el proyecto Container.

  2. Haga clic en la pestaña Vista de recursos.

  3. Abra la carpeta Cuadro de dialogo.

  4. Haga doble clic en la plantilla del cuadro de diálogo principal. En este ejemplo, use IDD_CONTAINER_DIALOG.

  5. Haga clic en el icono de control Circ del cuadro de herramientas.

  6. Haga clic en un punto del cuadro de diálogo para insertar el control Circ.

  7. En el menú Archivo, elija Guardar todo para guardar todas las modificaciones en la plantilla del cuadro de diálogo.

Modificaciones en el proyecto

Para permitir que la aplicación Contenedor acceda al control Circ, Visual C++ agrega automáticamente el archivo de implementación (.CPP) de la clase contenedora (CCirc) al proyecto Contenedor y al archivo de encabezado de clase contenedora (. H) al archivo de encabezado del cuadro de diálogo:

#include "circ.h"

Archivo de encabezado de clase contenedora (.H)

A fin de obtener y establecer propiedades (e invocar métodos) para el control Circ, la clase contenedora CCirc proporciona una declaración de todos los métodos y propiedades expuestos. En el ejemplo, estas declaraciones se encuentran en CIRC.H. El ejemplo siguiente es la parte de la clase CCirc que define las interfaces expuestas del control 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);
}
};

Después, se puede llamar a estas funciones desde otros procedimientos de la aplicación mediante la sintaxis normal de C++. Para obtener más información sobre el uso de este conjunto de funciones miembro a fin de acceder a los métodos y propiedades del control, vea la sección Programación del control ActiveX.

Modificaciones de variables de miembro en el proyecto

Una vez que se haya agregado el control ActiveX al proyecto e insertado en un contenedor de cuadros de diálogo, se puede acceder a él mediante otras partes del proyecto. La manera más fácil de acceder al control es crear una variable miembro de la clase de cuadro de diálogo, CContainerDlg (paso 2), que es del mismo tipo que la clase contenedora que agrega al proyecto Visual C++. Después, puede usar la variable miembro para acceder al control insertado en cualquier momento.

Cuando el cuadro de diálogo Agregar variable miembro agrega la variable miembro m_circctl al proyecto, también agrega las líneas siguientes al archivo de encabezado (. H) de la clase CContainerDlg:

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;
};

Además, se agrega automáticamente una llamada a DDX_Control a la implementación CContainerDlg de DoDataExchange:

DDX_Control(pDX, IDC_CIRCCTRL1, m_circctl);

Programación del control ActiveX

En este momento, ha insertado el control ActiveX en la plantilla de cuadro de diálogo y ha creado una variable miembro para él. Ahora puede usar la sintaxis común de C++ para acceder a las propiedades y métodos del control insertado.

Tal como se ha indicado (en El archivo de encabezado (.H) de la clase contenedora), el archivo de encabezado (. H) para la clase contenedora CCirc, en este caso CIRC. H, contiene una lista de funciones miembro que se pueden usar para obtener y establecer cualquier valor de propiedad expuesto. Las funciones miembro para los métodos expuestos también están disponibles.

Hay un lugar común para modificar las propiedades del control en la función miembro OnInitDialog de la clase de cuadro de diálogo principal. Se llama a esta función justo antes de que aparezca el cuadro de diálogo y se usa para inicializar su contenido, incluidos cualquiera de sus controles.

En el ejemplo de código siguiente se usa la variable miembro m_circctl para modificar las propiedades Caption y CircleShape del control Circ insertado:

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
}

Consulte también

Contenedores de controles ActiveX