本文介绍访问嵌入式 ActiveX 控件公开 的方法 和 属性 的过程。
重要
ActiveX 是一项不推荐用于新开发的旧技术。 有关取代 ActiveX 的新式技术的详细信息,请参阅 ActiveX 控件。
基本上,你将遵循以下步骤:
定义与 ActiveX 控件包装类相同的类型的成员变量(或其他访问形式)。
使用包装类的预定义成员函数对 ActiveX 控件进行编程。
对于此讨论,假设你已创建一个支持 ActiveX 控件的基于对话框的项目(命名容器)。 Circ 示例控件 Circ 将添加到生成的项目中。
将 Circ 控件插入项目(步骤 1)后,将 Circ 控件的实例插入应用程序的主对话框中。
过程
将 Circ 控件添加到对话框模板
加载 ActiveX 控件容器项目。 对于此示例,请使用
Container
项目。单击“资源视图”选项卡。
打开 Dialog 文件夹。
双击主对话框模板。 对于此示例,请使用 IDD_CONTAINER_DIALOG。
单击工具箱上的 Circ 控件图标。
单击对话框中的一个位置以插入 Circ 控件。
在“ 文件 ”菜单中,选择“ 全部保存 ”以将所有修改保存到对话框模板。
对项目的修改
若要使容器应用程序能够访问 Circ 控件,Visual C++会自动添加包装类 (CCirc
) 实现文件()。CPP 到容器项目和包装类标头()。H) 文件到对话框头文件:
#include "circ.h"
包装类标头 (.H) 文件
若要获取和设置 Circ 控件的属性(和调用方法), CCirc
包装器类提供所有公开方法和属性的声明。 在此示例中,这些声明位于 CIRC.H 中。 下面的示例是定义 ActiveX 控件公开接口的类 CCirc
部分:
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 控件添加到项目并嵌入到对话框容器中后,该项目的其他部分可以访问它。 访问控件的最简单方法是创建对话框类(步骤 2) 的成员变量 , CContainerDlg
该变量的类型与 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
}