共用方式為


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. 開啟 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 的呼叫 會自動新增至 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
}

另請參閱

ActiveX 控制項容器