ActiveX 控件容器:对 ActiveX 控件容器中的 ActiveX 控件编程
本文介绍访问嵌入式 ActiveX 控件的已公开方法和属性的过程。
重要
ActiveX 是旧技术,不应用于新开发。 有关取代 ActiveX 的新式技术的详细信息,请参阅 ActiveX 控件。
基本上,你会执行以下步骤:
定义成员变量(或其他形式的访问),其类型与 ActiveX 控件包装类相同。
使用包装类的预定义成员函数对 ActiveX 控件进行编程。
对于本讨论,假设你创建了一个基于对话框且支持 ActiveX 控件的项目(名为 Container)。 Circ 示例控件 Circ 会添加到生成的项目中。
将 Circ 控件插入项目(步骤 1)后,将 Circ 控件的实例插入应用程序的主对话框中。
过程
将 Circ 控件添加到对话框模板
加载 ActiveX 控件容器项目。 对于此示例,使用
Container
项目。单击“资源视图”选项卡。
打开“对话框”文件夹。
双击主对话框模板。 对于此示例,使用 IDD_CONTAINER_DIALOG。
单击工具箱上的 Circ 控件图标。
单击对话框中的一个位置以插入 Circ 控件。
在“文件”菜单中,选择“全部保存”以保存对话框模板的所有修改。
对项目的修改
为了使容器应用程序可以访问 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 的调用会自动添加到 CContainerDlg
的 DoDataExchange
实现中:
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
}