13.4 建立ActiveX控件c++
13.4.1 ActiveX概述編程
ActiveX是Microsoft提出的一組使用COM技術來使軟件部件在網絡環境中進行交互的技術集,它與具體的編程語言無關。做爲針對Internet應用開發的技術,ActiveX被普遍應用於WEB服務器以及客戶端應用程序各個方面。服務器
vC++一般提供MFC和ATL(ActiveX Template Library)兩個途徑來開發ActiveX控件。使用MFC開發ActiveX控件,能夠沒必要理會控件接口的細節,而把注意力集中在控件自己的功能上,可是生成的控件將比較大。並且,客戶端若是要運行此ActiveX控件,必須擁有相應版本MFC類庫的DLL,不然則必須同時下載這些巨大的類庫;使用ATL開發ActiveX控件時,因爲不涉及MFC的標準類庫,於是生成的控件相對較小,但開發者必需要了解COM和OLE技術的細節。在這裏,將主要介紹使用MFC開發ActiveX控制的方法,由於這種方法相對會比較容易。網絡
若是使用MFC開發ActiveX控件,則能夠用MFC ActiveX Control Wizard生成工程框架,vc++會自動產生三個類:(假設MyName是控件的名字)框架
· CMyNameApp:從類COleControlModule派生,而類COleControlModule則派生自CwinApp。編程語言
· CMyNameCtrl:從類COleControl派生,而類COleControl則派生自CWnd。編輯器
· CMyNamePropPage:從類COlePropertyPage派生,而類COlePropPage則派生自CDial09。ide
能夠看出,這個框架與通常的MFC應用程序有些相似。開發人員的大部分工做是在CMyNameCtrl中,經過爲此類添加屬性、方法來完成相應的功能。函數
在下面的一節中,就來介紹使用MFC嚮導建立一個簡單的ActiveX控件的方法。組件化
13.4.2 使用MFC嚮導建立一個簡單的ActiveX控件
本節所要建立的ActiveX控件並無什麼實際的用處,它只是演示了使用MFC建立
ActiveX控件的方法過程,具體包括屬性建立、方法建立以及事件建立等。在建立了ActiveX控件後,將使用VC++編寫一個客戶端程序,來演示如何在Windows CE下訪問ActiveX控件。
1.使用MFC嚮導建立ActiveX
(1)使用VS2008句導建立一個「MFC智能設備ActiveX控件」工程,將項目名稱設爲MyCEActiveX,而後按照默認設置完成嚮導。將編譯環境設置yinchengos。
(2)爲CMyCEActiveXCtrl類添加屬性和方法。在類視圖中,選中DMyCEActiveX接口,經過右鍵快捷菜單「添加」,來爲ActiveX控件添加屬性和方法,如圖13-20所示。
圖13-20 爲ActiveX控件添加屬性和方法
MFC ClassWizard對話框單擊「添加屬性」菜單,添加一個MsgContext屬性,其類型爲BSTR,如圖13-21所示。
圖13-21 「添加屬性向導」對話框
單擊「添加方法」,添加一個ShowMessage方法,該方法沒有返回值。
圖13-22 「添加方法嚮導」對話框
(3)實現屬性和方法。
1)在CMyCEActiveXCtrl類裏添加~個私有變量m_MsgContext,代碼以下:
private:
CString m_MsgContext;
2)修改屬性實現代碼,代碼如程序清單。
BSTR CMyCEActiveXCtrl::GetMsgContext(void)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
// TODO: 在此添加調度處理程序代碼
return m_MsgContext.AllocSysString();
}
//設置MsgContext屬性
void CMyCEActiveXCtrl::SetMsgContext(LPCTSTR newVal)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
// TODO: 在此添加屬性處理程序代碼
if (m_MsgContext.Compare(newVal) != 0 )
{
m_MsgContext = newVal;
//出發OnChange事件
OnMsgChange();
SetModifiedFlag();
}
}
3)添加ShowMessage方法實現代碼. 、
void CMyCEActiveXCtrl::ShowMessage(void)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
AfxMessageBox(m_MsgContext);
}
(4)編輯屬性編輯框。
1)在資源編輯器中編輯屬性對話框,設計界面如圖13-23所示,將消息輸入框標識爲IDC EDT MSG。
圖l3-23編輯屬性對話框
2)爲輸入框控件添加關聯變量m_Msg,類型爲CString。這裏還須要修改CmyCE ActiveX PropPage::DoData Exchange函數,實現消息輸入框與控件的MsgContext屬性關聯。CmyCE ActiveX PropPage::DoData Exchange函數的實現以下:
//cMycEActivexPropPage::DoDataExchange一在頁和屬性問移動數據
void CMyCEActiveXPropPage::DoDataExchange(CdataExchange*pDX)
{ .
DDP_Text(pDX,IDC_EDT_MSG,m_Msg,L」MsgContext」);
DDX_Text(pDX,IDC_EDT_MSG,m_Msg);
DDP_PostProcesSing(pDX);
}
3)在CMyCEActiveXCtrl類的DoPropExchange方法裏添加以下代碼,用於關聯屬性,並初始化MsgContext屬性值。PX—String(pPX,L」MsgContext」,m MsgContext,L」歡迎使用此Acitvex,呵呵」);至此,除事件之外,其餘的功能都基本獲得了實現。
(5)添加事件。
在該示例中,將添加一個MsgContext屬性被改變時的通知事件。該事件的實現也很簡單,具體實現以下:
1)在類視圖中選擇CMyCEActiveXCtrl類,經過右鍵快捷菜單「添加事件」來添加OnMsgChange事件。該事件在屬性MsgContext值發生變化時被觸發。如圖13-24
2)修改SetMsgContext方法。在CMyCEActiveXCtrl類的SetMsgContext方法裏,因MsgContext的值發生變化而觸發OnMsgChange事件,其代碼如下。
void CMyCEActiveXCtrl::SetMsgContext(LPCTSTR newVal)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
// TODO: 在此添加屬性處理程序代碼
if (m_MsgContext.Compare(newVal) != 0 )
{
m_MsgContext = newVal;
//出發OnChange事件
OnMsgChange();
SetModifiedFlag();
}
}
圖13-24事件嚮導
最後編譯部署該項目,系統將自動遠程註冊此0CX。同時到這裏MyCEActiveX控件也編寫完成了,下面就介紹如何來使用該ActiveX控件。
2.應用ActiveX控件
在該節中,將編寫Windows CE中的ActiveX測試程序,編寫步驟以下所示。
(1)使用vs2008智能設備IMFC智能設備應用程序嚮導建立一個基於對話框的應用程序MyCEActiveX ,編譯環境設置爲yinchengos.
注意:在嚮導對話框中,必定要選中「ActiveX控件」複選框,表示應用程序支持ActiveX組件。
(2)選擇VS2008主菜單「項目添加類MFCActiveX控件中的MFC類,來添加MyCEActiveX控件的定義。
在「從如下來源添加類」項中選擇「文件」單選框,而後指定OCX的位置,將接口_DMyCEActiveX和_DMyCEActiveXEvents添加到「生成的類」列表中,單擊「完成」按鈕,就添加了MyCEActiveX控件的定義。如圖13-25
圖13-25類嚮導
打_DMyCEActiveX接口定義文件CDMyCEActiveX.h,因爲經過嚮導建立的MyCEActiveX控件缺乏了訪問MsgContext的屬性方法,所以在CDMyCEActiveX.h中還須要添加GetMsgContext和SetMsgContext兩個公有方法,以便訪問屬性。
CString GetMsgContext()
{
CString result;
GetProperty(0x1, VT_BSTR, (void*)&result);
return result;
}
void SetMsgContext(LPCTSTR propVal)
{
SetProperty(0x1, VT_BSTR, propVal);
}
(3)爲CMyCEActiveX_TestDlg類添加私有成員m_myCEActiveX,存儲MyCEActiveX控件對象。
private:
//定義MyCEActiveX控件對象
CDMyCEActiveX m_myCEActiveX;
在CMyCEActiveXTestDlg::0nInitDialog()中建立MyCEActiveX對象,代碼以下:
//建立MyCEActiveX控件對象
CRect rc(0,0,100,100);
m_myCEActiveX.CreateControl(m_myCEActiveX.GetClsid(), L" ",
WS_VISIBLE,rc,this,5678,NULL,FALSE,NULL);
(4)在主對話框上添加一個按鈕(IDC—BTN—TEST),在該按鈕的單擊事件中設置Activex
屬性和調用ActiveX控件方法,代碼以下:
//測試MyCEActiveX控件使用
void CMyCEActiveX_TestDlg::OnBnClickedBtnTest()
{
m_myCEActiveX.SetMsgContext(L"歡迎使用Eric製做的ACTIVEX控件");
m_myCEActiveX.ShowMessage();
}
(5)實現MyCEActiveX控件的OnMsgChange事件。
首先在MyCEActiveX_TestDlg.h文件中添加OnMsgChangeMyceactivexctrl事件函數以及OLE COM事件映射宏。定義以下:
//MycEActivex控件0nMsgChange事件
afx_msg void onMsgChangeMyceactiVexctrl();
//定義0LE COM事件映射
DECLARE_EVENTS INK_MAP()
接着在MyCEActiveXTestDlg.cpp文件中添加OLE事件宏,用於關聯ActiveX事件函數,具體實現以下:
BEGIN_MESSAGE_MAP(CMyCEActiveX_TestDlg, CDialog)
//}}AFX_MSG_MAP
ON_BN_CLICKED(IDC_BTN_TEST, &CMyCEActiveX_TestDlg::OnBnClickedBtnTest)
END_MESSAGE_MAP()
BEGIN_EVENTSINK_MAP(CMyCEActiveX_TestDlg, CDialog)
ON_EVENT(CMyCEActiveX_TestDlg, 5678, 1 /* OnMsgChange */, OnMsgChangeMyceactivexctrl, VTS_NONE)
END_EVENTSINK_MAP()
最後再來實現0nMsgChangeMyceactivexctrl函數,代碼以下:
//MyCEActiveX控件MsgContext屬性被改變事件
void CMyCEActiveX_TestDlg::OnMsgChangeMyceactivexctrl()
{
AfxMessageBox(L"MsgContext屬性已被改變");
}
至此,就實現了MyCEActiveX控件的OnMsgChange事件,這其中主要包括3部份內容,經過逐層學習,就會很快理解ActiveX事件函數的實現機制了。
通過以上5個步驟,客戶應用程序就編寫完成了。把它下載到模擬器上運行以查看其運行效果。當單擊按鈕時,系統將會前後彈出「歡迎使用Eric製做的ACTIVEX控件」和「MsgContext屬性已被改變」提示框。
本示例只是粗略地介紹了使用MFC建立簡單的ActiveX的方法,若是讀者想要更深刻地瞭解ActiveX,則能夠參考其餘一些ActiveX書籍,來建立更加複雜和實用的ActiveX控件。
13.5小結
COM是由Microsoft提出的組件標準,它不只定義了組件程序之間交互的標準,並且還提供了組件程序運行所須要的環境。COM體現了組件化程序設計的思想,複雜的應用程序被設計成一些小的、功能單一的組件模型,這些組件模塊能夠在同一臺計算機或者不一樣的計算機上運行。本章的範例基本實現了Windows Embedded Compact 7用到的COM開發框架與簡單實例,但願讀者認真編程實踐。