ActiveX 控件容器:对 ActiveX 控件容器中的 ActiveX 控件编程

本文介绍访问嵌入式 ActiveX 控件的已公开方法属性的过程。

重要

ActiveX 是旧技术,不应用于新开发。 有关取代 ActiveX 的新式技术的详细信息,请参阅 ActiveX 控件

基本上,你会执行以下步骤:

  1. 使用库将 ActiveX 控件插入 ActiveX 容器项目中

  2. 定义成员变量(或其他形式的访问),其类型与 ActiveX 控件包装类相同。

  3. 使用包装类的预定义成员函数对 ActiveX 控件进行编程

对于本讨论,假设你创建了一个基于对话框且支持 ActiveX 控件的项目(名为 Container)。 Circ 示例控件 Circ 会添加到生成的项目中。

将 Circ 控件插入项目(步骤 1)后,将 Circ 控件的实例插入应用程序的主对话框中。

过程

将 Circ 控件添加到对话框模板

  1. 加载 ActiveX 控件容器项目。 对于此示例,使用 Container 项目。

  2. 单击“资源视图”选项卡。

  3. 打开“对话框”文件夹

  4. 双击主对话框模板。 对于此示例,使用 IDD_CONTAINER_DIALOG

  5. 单击工具箱上的 Circ 控件图标。

  6. 单击对话框中的一个位置以插入 Circ 控件。

  7. 在“文件”菜单中,选择“全部保存”以保存对话框模板的所有修改

对项目的修改

为了使容器应用程序可以访问 Circ 控件,Visual C++ 会自动将包装类 (CCirc) 实现文件 (.CPP) 添加到容器项目,并将包装类头文件 (.H) 添加到对话框头文件:

#include "circ.h"

包装类头文件 (.H)

为了对 Circ 控件获取和设置属性(以及调用方法),CCirc 包装类提供所有已公开方法和属性的声明。 在此示例中,这些声明处于 CIRC.H 中。 下面的示例是类 CCirc 中定义 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);
}
};

随后可以使用普通 C++ 语法从应用程序的其他过程调用这些函数。 有关使用此成员函数集访问控件的方法和属性的详细信息,请参阅对 ActiveX 控件编程部分。

对项目的成员变量修改

ActiveX 控件添加到项目并嵌入在对话框容器中后,项目的其他部分可以访问它。 访问控件的最简单方法是创建对话框类 CContainerDlg 的成员变量(步骤 2),该变量的类型与 Visual C++ 添加到项目的包装类相同。 随后可以使用成员变量随时访问嵌入控件。

当“添加成员变量”对话框将 m_circctl 成员变量添加到项目时,它还会将以下行添加到 CContainerDlg 类的头文件 (.H):

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

此外,对 DDX_Control 的调用会自动添加到 CContainerDlgDoDataExchange 实现中:

DDX_Control(pDX, IDC_CIRCCTRL1, m_circctl);

对 ActiveX 控件编程

此时,你已将 ActiveX 控件插入对话框模板中,并为它创建了成员变量。 现在可以使用常见 C++ 语法访问嵌入控件的属性和方法。

正如指出的那样(在包装类头文件 (.H) 中),CCirc 包装类的头文件 (.H)(在本例中为 CIRC.H)包含可用于获取和设置任何已公开属性值的成员函数的列表。 已公开方法的成员函数也可供使用。

修改控件属性的常见位置是在主对话框类的 OnInitDialog 成员函数中。 此函数就在对话框出现之前调用,用于初始化其内容(包括其任何控件)。

下面的代码示例使用 m_circctl 成员变量修改嵌入 Circ 控件的 Caption 和 CircleShape 属性

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
}

另请参阅

ActiveX 控件容器