Contenedores de controles ActiveX: Controles ActiveX de programación en un contenedor de controles ActiveX
En este artículo se describe el proceso para tener acceso a métodos expuesto y a propiedades de controles ActiveX incrustados.Básicamente, debe seguir estos pasos:
Inserte un control ActiveX en el proyecto de contenedor ActiveX mediante galería.
ElDefina una variable miembro (u otro formulario de acceso) del mismo tipo que la clase contenedora de controles ActiveX.
Programar el control ActiveX mediante las funciones predefinidas de miembro de la clase contenedora.
Para este tutorial, supongamos que ha creado un proyecto basado en (denominado Container) con el control ActiveX.El ejemplo de Circ, Circ, se agregará al proyecto resultante.
Una vez que el control de Circ se inserta en el proyecto (el paso 1), inserta una instancia del control de Circ en el cuadro de diálogo principal de la aplicación.
Procedimientos
Para agregar el control de Circ a la plantilla de cuadro de diálogo
Cargue el proyecto de contenedor de controles ActiveX.En este ejemplo, use el proyecto de Container .
Haga clic en la ficha Vista de recursos.
Abra la carpeta de Dialog .
Haga doble clic en la plantilla principal del cuadro de diálogo.En este ejemplo, use IDD_CONTAINER_DIALOG.
Haga clic en el icono de control de Circ en el cuadro de herramientas.
Haga clic en un punto dentro del cuadro de diálogo para incrustar el control de Circ.
En el menú de archivo , elija Guardar todos para guardar todas las modificaciones a la plantilla en el cuadro de diálogo.
Modificaciones al proyecto
Para habilitar la aplicación contenedora para tener acceso al control de Circ, Visual C++ agrega automáticamente el archivo de implementación de la clase contenedora (CCirc) (.CPP) al proyecto del contenedor y el encabezado de la clase contenedora (. H) archivo al archivo de encabezado de cuadro de diálogo:
#include "circ.h"
El encabezado de la clase contenedora (. h) archivo
Para obtener y establecer propiedades (e invocar métodos) para el control de Circ, la clase contenedora de 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 forma 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);
}
};
Estas funciones se pueden llamar desde otro de los procedimientos de la aplicación mediante la sintaxis normal de C++.Para obtener más información sobre cómo usar este conjunto de funciones de miembro para tener acceso a los métodos y propiedades de control, vea la sección Programar el control ActiveX.
Variable miembro Modifications al proyecto
Una vez que el control ActiveX se ha agregado al proyecto y se ha insertado en un contenedor del cuadro de diálogo, puede obtener acceso a otras partes del proyecto.La manera más fácil de tener acceso al control a cree una variable miembro de la clase de diálogo, CContainerDlg (el paso 2), con el mismo tipo que la clase contenedora agregará al proyecto en Visual C++.Puede utilizar a la variable miembro para obtener acceso al control incrustado en cualquier momento.
Cuando el cuadro de diálogo de Add Member Variable agrega a la variable miembro de m_circctl al proyecto, también agrega las líneas siguientes al archivo de encabezado (. h) de la clase de 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, una llamada a DDX_Control se agrega automáticamente a la implementación de los entity_CODECContainerDlg de DoDataExchange:
DDX_Control(pDX, IDC_CIRCCTRL1, m_circctl);
Programar el control ActiveX
En este punto, ha insertado el control ActiveX en la plantilla de cuadro de diálogo y ha creado una variable miembro para él.Ahora puede utilizar la sintaxis habitual de C++ para tener acceso a las propiedades y los métodos de control incrustado.
Como conocido (en El encabezado de la clase contenedora (. h) archivo), el archivo de encabezado (. H) para la clase contenedora de CCirc , en este caso CIRC.H, contiene una lista de funciones miembro que puede utilizar para obtener y establecer los valores de propiedad expuesta.Las funciones miembro para los métodos expuestos también están disponibles.
Un lugar común para modificar las propiedades del control es la función miembro de OnInitDialog de la clase principal del diálogo.Esta función se denomina justo antes del cuadro de diálogo y se utiliza para inicializar su contenido, incluso a ninguno de los controles.
El ejemplo de código siguiente utiliza la variable miembro de m_circctl para modificar las propiedades caption y de CircleShape de control incrustado de Circ:
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
}