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

本文描述的访问公开的 ActiveX 控件嵌入的 方法属性 和过程。 基本上,您将执行以下步骤:

  1. 使用 库的插入到 ActiveX 容器 ActiveX 控件项目

  2. 定义的成员变量 (或访问其他窗体) 相同类型作为 ActiveX 控件包装类。

  3. 使用包装类中的预定义的成员函数上的编程 ActiveX 控件。

对于本讨论中,假设您创建了基于对话框的项目 (名为) 的容器 ActiveX 控件。 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. 找到。 下面的示例为定义 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 控件在容器被添加到项目,并嵌入其可以由项目的其他部分访问。 简单的访问方法控件是对类的对话框,创建成员变量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 的调用会自动添加到 DoDataExchange的 CContainerDlg 实现:

DDX_Control(pDX, IDC_CIRCCTRL1, m_circctl);

编程 ActiveX 控件

此时,您将插入 ActiveX 控件添加到对话框模板并为其创建的成员变量。 现在可以使用"一般 C++ 语法访问嵌入式控件的属性和方法。

作为在头文件注释 ( 包装类 (标题。H) 文件),(。CCirc 包装类的 H),在这种情况下,CIRC.H 包含列表成员函数可以使用获取并设置所有公开的属性值。 公开的方法成员函数也可用。

修改控件属性的公共可在主对话框类的 OnInitDialog 成员函数。 调用该函数时,在对话框中显示并使用初始化之前,其内容包括任何控件。

下面的代码示例使用 m_circctl 成员变量来修改 Circ 嵌入的控件的标题和 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 控件容器