共用方式為


ActiveX 控件容器:在 ActiveX 控件容器中設計 ActiveX 控制件

本文說明如何存取嵌入 ActiveX 控制項的公開方法和屬性的過程。

這很重要

ActiveX 是不應該用於新開發的舊版技術。 如需取代 ActiveX 的新式技術詳細資訊,請參閱 ActiveX 控件

基本上,您將遵循下列步驟:

  1. 使用畫廊將 ActiveX 控件插入 ActiveX 容器專案中。

  2. 定義與 ActiveX 控制件包裝函式類別相同類型的成員變數(或其他存取形式)。

  3. 使用包裝函式類別的預先定義成員函式,對 ActiveX 控件進行程式設計

在此討論中,假設您已使用 ActiveX 控制項支援建立對話式專案(名為 Container)。 將 Circ 範例控制項新增至產生的專案。

一旦將 Circ 控制件插入專案 (步驟 1),請將 Circ 控制件的實體插入應用程式的主要對話框中。

程序

將 Circ 控制項新增至對話框範本

  1. 載入 ActiveX 控制件容器專案。 在此範例中,請使用 Container 專案。

  2. 按兩下 [資源檢視] 索引標籤。

  3. 開啟 Dialog 資料夾。

  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的呼叫會自動新增至CContainerDlgDoDataExchange實作中。

DDX_Control(pDX, IDC_CIRCCTRL1, m_circctl);

ActiveX 控制項程式設計

此時,您已將 ActiveX 控制件插入對話框範本,並為其建立成員變數。 您現在可以使用常見的C++語法來存取內嵌控件的屬性和方法。

如前所述(在包裝類別標頭 (.H) 檔案中),包裝類別的頭檔 (.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 控件容器