Contêineres de controle ActiveX: programando controles ActiveX em um contêiner de controle ActiveX
Este artigo descreve o processo para acessar os métodos e as propriedades expostas dos controles ActiveX inseridos.
Importante
O ActiveX é uma tecnologia herdada que não deve ser usada para novo desenvolvimento. Para mais informações sobre tecnologias modernas que substituem o ActiveX, confira Controles do ActiveX.
Basicamente, você seguirá estas etapas:
Inserir um controle ActiveX no projeto de contêiner do ActiveX usando a Galeria.
Definir uma variável membro (ou outra forma de acesso) do mesmo tipo que a classe wrapper de controle ActiveX.
Programar o controle ActiveX usando funções membro predefinidas da classe wrapper.
Para essa discussão, suponha que você criou um projeto baseado em caixa de diálogo (chamado Contêiner) com suporte do controle ActiveX. O controle de exemplo Circ será adicionado ao projeto resultante.
Após o controle Circ ser inserido no projeto (etapa 1), insira uma instância dele na caixa de diálogo principal do aplicativo.
Procedimentos
Para adicionar o controle Circ ao modelo de caixa de diálogo
Carregue o projeto do contêiner do controle ActiveX. Para este exemplo, use o projeto
Container
.Clique na guia Modo de Exibição de Recursos.
Abra a pasta Caixa de Diálogo.
Clique duas vezes no modelo de caixa de diálogo principal. Para este exemplo, use IDD_CONTAINER_DIALOG.
Clique no ícone do controle Circ na Caixa de ferramentas.
Clique em um ponto dentro da caixa de diálogo para inserir o controle Circ.
No menu Arquivo, escolha Salvar Tudo para salvar todas as modificações no modelo de caixa de diálogo.
Modificações no projeto
Para permitir que o aplicativo de Contêiner acesse o controle Circ, o Visual C++ adiciona automaticamente o arquivo de implementação (.CPP) da classe wrapper (CCirc
) ao projeto de Contêiner e o arquivo de cabeçalho da classe wrapper (.H) ao arquivo de cabeçalho da caixa de diálogo:
#include "circ.h"
O arquivo de cabeçalho da classe wrapper (.H)
Para obter e definir propriedades (e invocar métodos) para o controle Circ, a classe wrapper CCirc
fornece uma declaração de todos os métodos e propriedades expostos. No exemplo, essas declarações são encontradas em CIRC.H. O seguinte exemplo é a parte da classe CCirc
que define as interfaces expostas do controle 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);
}
};
Essas funções podem, então, ser chamadas de outro dos procedimentos do aplicativo usando a sintaxe normal de C++. Para obter mais informações sobre como usar esse conjunto de funções membros para acessar os métodos e propriedades do controle, consulte a seção Programação do controle ActiveX.
Modificações de variável membro no projeto
Após o controle ActiveX ter sido adicionado ao projeto e inserido em um contêiner de caixa de diálogo, ele poderá ser acessado por outras partes do projeto. A maneira mais fácil de acessar o controle é criar uma variável membro da classe de caixa de diálogo, CContainerDlg
(etapa 2), que é do mesmo tipo que a classe wrapper adicionada ao projeto pelo Visual C++. Em seguida, você pode usar a variável membro para acessar o controle inserido a qualquer momento.
Quando a caixa de diálogo Adicionar Variável Membro adiciona a variável membro m_circctl ao projeto, ela também adiciona as seguintes linhas ao arquivo de cabeçalho (.H) da classe 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;
};
Além disso, uma chamada para DDX_Control é adicionada automaticamente à implementação CContainerDlg
de DoDataExchange
:
DDX_Control(pDX, IDC_CIRCCTRL1, m_circctl);
Programação do controle ActiveX
Neste ponto, você inseriu o controle ActiveX em seu modelo de caixa de diálogo e criou uma variável membro para ele. Agora, você pode usar a sintaxe comum de C++ para acessar as propriedades e os métodos do controle inserido.
Conforme observado (em Arquivo de cabeçalho da classe Wrapper (.H)), o arquivo de cabeçalho (.H) da classe wrapper CCirc
, nesse caso CIRC.H, contém uma lista de funções membro que você pode usar para obter e definir qualquer valor de propriedade exposto. Funções membro para métodos expostos também estão disponíveis.
Um local comum para modificar as propriedades do controle é a função membro OnInitDialog
da classe de caixa de diálogo principal. Essa função é chamada pouco antes da caixa de diálogo ser exibida e é usada para inicializar seu conteúdo, incluindo os controles.
O seguinte exemplo de código usa a variável membro m_circctl para modificar as propriedades Caption e CircleShape do controle Circ inserido:
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
}