Compartilhar via


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:

  1. Inserir um controle ActiveX no projeto de contêiner do ActiveX usando a Galeria.

  2. Definir uma variável membro (ou outra forma de acesso) do mesmo tipo que a classe wrapper de controle ActiveX.

  3. 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

  1. Carregue o projeto do contêiner do controle ActiveX. Para este exemplo, use o projeto Container.

  2. Clique na guia Modo de Exibição de Recursos.

  3. Abra a pasta Caixa de Diálogo.

  4. Clique duas vezes no modelo de caixa de diálogo principal. Para este exemplo, use IDD_CONTAINER_DIALOG.

  5. Clique no ícone do controle Circ na Caixa de ferramentas.

  6. Clique em um ponto dentro da caixa de diálogo para inserir o controle Circ.

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

Confira também

Contêineres de controle ActiveX