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 expostos e as propriedades dos controles ActiveX inseridos.

Importante

O ActiveX é uma tecnologia herdada que não deve ser usada para o novo desenvolvimento. Para obter mais informações sobre tecnologias modernas que substituem o ActiveX, consulte Controles ActiveX.

Basicamente, você seguirá estas etapas:

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

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

  3. Programe o controle ActiveX usando funções de membro predefinidas da classe wrapper.

Para esta discussão, suponha que você tenha criado um projeto baseado em caixa de diálogo (chamado Contêiner) com suporte ao controle ActiveX. O controle de exemplo circ, Circ, será adicionado ao projeto resultante.

Depois que o controle Circ for inserido no projeto (etapa 1), insira uma instância do controle Circ 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 de contêiner de controle ActiveX. Para este exemplo, use o Container projeto.

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

  3. Abra a pasta Caixa de Diálogo .

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

  5. Clique no ícone de 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 da caixa de diálogo.

Modificações no Projeto

Para habilitar o aplicativo contêiner a acessar o controle Circ, o Visual C++ adiciona automaticamente o arquivo de implementação da classe wrapper (CCirc). CPP) para o projeto contêiner e o cabeçalho da classe wrapper (. H) arquivo para o arquivo de cabeçalho da caixa de diálogo:

#include "circ.h"

O cabeçalho da classe Wrapper (. H) Arquivo

Para obter e definir propriedades (e invocar métodos) para o controle Circ, a CCirc classe wrapper fornece uma declaração de todos os métodos e propriedades expostos. No exemplo, essas declarações são encontradas em CIRC.H. O exemplo a seguir é 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 ser chamadas de outros procedimentos do aplicativo usando a sintaxe C++ normal. Para obter mais informações sobre como usar essa função membro definida para acessar os métodos e as propriedades do controle, consulte a seção Programando o controle ActiveX.

Modificações de variável de membro no projeto

Depois que o controle ActiveX tiver 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 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 de membro para acessar o controle inserido a qualquer momento.

Quando a caixa de diálogo Adicionar Variável de Membro adiciona a variável de membro m_circctl ao projeto, ela também adiciona as seguintes linhas ao arquivo de cabeçalho (. H) da 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;
};

Além disso, uma chamada para DDX_Control é adicionada automaticamente à CContainerDlgimplementação de DoDataExchange:

DDX_Control(pDX, IDC_CIRCCTRL1, m_circctl);

Programando o controle ActiveX

Neste ponto, você inseriu o controle ActiveX no modelo de caixa de diálogo e criou uma variável de membro para ele. Agora você pode usar a sintaxe C++ comum para acessar as propriedades e os métodos do controle inserido.

Conforme observado (no cabeçalho da classe Wrapper (. H) Arquivo), o arquivo de cabeçalho (. H) para a CCirc classe wrapper, nesse caso, CIRC. H contém uma lista de funções de membro que você pode usar para obter e definir qualquer valor de propriedade exposto. As funções de membro para métodos expostos também estão disponíveis.

Um local comum para modificar as propriedades do controle está na OnInitDialog função membro da classe de diálogo principal. Essa função é chamada pouco antes da caixa de diálogo aparecer e é usada para inicializar seu conteúdo, incluindo qualquer um de seus controles.

O exemplo de código a seguir usa a variável de 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
}

Consulte também

Contêineres de controle ActiveX