本文說明如何存取嵌入 ActiveX 控制項的公開方法和屬性的過程。
這很重要
ActiveX 是不應該用於新開發的舊版技術。 如需取代 ActiveX 的新式技術詳細資訊,請參閱 ActiveX 控件。
基本上,您將遵循下列步驟:
使用畫廊將 ActiveX 控件插入 ActiveX 容器專案中。
定義與 ActiveX 控制件包裝函式類別相同類型的成員變數(或其他存取形式)。
使用包裝函式類別的預先定義成員函式,對 ActiveX 控件進行程式設計。
在此討論中,假設您已使用 ActiveX 控制項支援建立對話式專案(名為 Container)。 將 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 控制件新增至專案並內嵌在對話框容器中之後,即可由專案的其他部分存取。 存取控件最簡單的方式是建立對話框類別 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) 檔案中),包裝類別的頭檔 (.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
}