版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)
文檔簡介
1、摘要: 本文對COM組件中的ActiveX控件的MFC開發(fā)方法進行了介紹,講述了用戶自定義和庫存屬性、方法以及事件的添加方法和屬性頁的制作過程。使讀者能夠掌握基本的MFC ActiveX開發(fā)方法。關(guān)鍵詞: MFC;ActiveX控件;COM閱讀目錄: 一、前言二、建立工程框架三、屬性、方法以及事件的添加四、實現(xiàn)屬性表五、在包容程序中使用ActiveX控件六、小結(jié)前言ActiveX控件是一種實現(xiàn)了一系列特定接口而使其在使用和外觀上更象一個控件的COM組件。ActiveX控件這種技術(shù)涉及到了幾乎所有的COM和OLE的技術(shù)精華,如可鏈接對象、統(tǒng)一數(shù)據(jù)傳輸、OLE文檔、屬性頁、永久存儲以及OLE自動化
2、等。 ActiveX控件作為基本的界面單元,必須擁有自己的屬性和方法以適合不同特點的程序和向包容器程序提供功能服務(wù),其屬性和方法均由自動化服務(wù)的 IDispatch接口來支持。除了屬性和方法外,ActiveX控件還具有區(qū)別于自動化服務(wù)的一種特性-事件。事件指的是從控件發(fā)送給其包容程序的一 種通知。與窗口控件通過發(fā)送消息通知其擁有者類似,ActiveX控件是通過觸發(fā)事件來通知其包容器的。事件的觸發(fā)通常是通過控件包容器提供的 IDispatch接口來調(diào)用自動化對象的方法來實現(xiàn)的。在設(shè)計ActiveX控件時就應(yīng)當(dāng)考慮控件可能會發(fā)生哪些事件以及包容器程序?qū)ζ渲械哪男┦?件感興趣并將這些事件包含進來
3、。與自動化服務(wù)不同,ActiveX控件的方法、屬性和事件均有自定義(custom)和庫存(stock)兩種不同的類 型。自定義的方法和屬性也就是是普通的自動化方法和屬性,自定義事件則是自己選取名字和Dispatch ID的事件。而所謂的庫存方法、屬性和事件則是使用了ActiveX控件規(guī)定了名字和Dispatch ID的標(biāo)準(zhǔn)方法、屬性和事件。 ActiveX控件可以使COM組件從外觀和使用上能與普通的窗口控件一樣,而且還提供了類似于設(shè)置Windows標(biāo)準(zhǔn)控件屬性的屬性頁,使其能夠在包 容器程序的設(shè)計階段對ActiveX控件的屬性進行可視化設(shè)置。ActiveX控件提供的這些功能使得對其的使用將是非
4、常方便的。本文下面即以MFC為工 具對ActiveX控件的開發(fā)進行介紹。建立工程框架通過MFC ActiveX ControlWizard向?qū)Э梢苑浅H菀椎慕⒁粋€MFC ActiveX控件工程框架。按照默認(rèn)的選項將建立如圖1所示的工程結(jié)構(gòu):圖1 使用缺省選項建立的ActiveX控件工程結(jié)構(gòu) 其中,_DSample68和_DSample68Events這兩個接口將為客戶程序提供本控件的屬性、方法以及可能響應(yīng)的事件。全局函數(shù) DllRegisterServer()和DllUnregisterServer()分別用于控件在注冊表的注冊和注銷,一般不需要對其進行改動。 應(yīng)用程序類從COleContr
5、olModule繼承。而COleControlModule有是從CWinApp派生,提供了初始化控件模塊的功能。 CSample68PropPage的基類是COlePropertyPage,CDialog類的派生類,主要負(fù)責(zé)對屬性頁中對圖形界面下用戶控件屬性 的顯示??丶怌Sample68Ctrl類是這幾個類中比較重要的一個類,大部分實質(zhì)性工作都在該類完成,其基類為COleControl,從CWnd 和CCmdTarget繼承,因此能夠為控件對象提供與MFC窗口對象相同的功能同時也提供了一系列事件觸發(fā)函數(shù)和一個分發(fā)映射表,使ActiveX控件 能夠同包容器程序有效地進行交互。該類的派生類將可
6、以在滿足特定的條件時向控件的包容器發(fā)送消息或是觸發(fā)事件,以通知包容器程序在控件內(nèi)有一些重要的事件 發(fā)生。分發(fā)映射表是其中很重要的一個部分,負(fù)責(zé)向包容器程序暴露控件提供的方法和屬性。圖2展示了COleControl類在控件與包容器通信中所起的作 用。可以看出,ActiveX控件與其包容器之間的所有通信過程都是由COleControl來完成的:圖2 COleControl在ActiveX控件與包容器通信中的作用控件類對基類COleControl的OnDraw()函數(shù)進行了重載,向?qū)闪巳缦氯笔〈a,其作用是在控件的客戶區(qū)繪制一個橢圓。在編程過程中通常要對其進行替換:void CSample68C
7、trl:OnDraw(CDC* pdc, const CRect& rcBounds, const CRect& rcInvalid/ TODO: Replace the following code with your own drawing code.pdc-FillRect(rcBounds, CBrush:FromHandle(HBRUSHGetStockObject(WHITE_BRUSH;pdc-Ellipse(rcBounds;圖3 插入ActiveX控件圖4 插入的待測試控件 對向?qū)傻拇a進行編譯后,將產(chǎn)生擴展名為ocx的ActiveX控件。ActiveX控件并不能獨立運行
8、,只能在包容器程序中才能夠運行。通常,為 了調(diào)試方便而多使用VC+附帶的ActiveX Control Test Container工具以在測試階段對ActiveX控件進行調(diào)試。在測試工具的客戶區(qū)點擊鼠標(biāo)右鍵,并選中彈出菜單的Insert New Control菜單項,將彈出圖3所示的對話框,左側(cè)的列表框中列出了當(dāng)前系統(tǒng)中所有注冊的ActiveX控件,選中要測試的控件并將其插入到測試程 序即可通過Control菜單下的各菜單項對控件的方法、屬性以及事件等進行測試。在位于下方的分割視圖中將跟蹤顯示出調(diào)試記錄(參見圖4)。屬性、方法以及事件的添加圖5 屬性的添加圖6 方法的添加 對ActiveX控
9、件屬性、方法和事件的添加均有庫存和自定義兩種。其中對屬性和方法的添加在MFC ClassWizard對話框的Automation頁中通過按鈕Add Property和Add Method彈出如圖5和圖6所示的添加屬性和添加方法的對話框來完成。對于庫存屬性和方法,可以直接從External name組合框的下拉列表中選取,Implementation項將自動設(shè)置為Stock。對于自定義屬性和方法的添加與在自動化對象中為接口添加屬性和 方法的過程一樣,ClassWizard將在.odl文件和控件類生成相應(yīng)的代碼,下面給出的是在控件類中實現(xiàn)的部分分發(fā)映射代碼:/ Dispatch maps/AFX_
10、DISPATCH(CSample68CtrlCString m_message;afx_msg void OnMessageChanged(;afx_msg short GetXPos(;afx_msg void SetXPos(short nNewValue;afx_msg short GetYPos(;afx_msg void SetYPos(short nNewValue;afx_msg short MessageLen(;/AFX_DISPATCHDECLARE_DISPATCH_MAP(/ Dispatch and event IDspublic:enum /AFX_DISP_ID(
11、CSample68CtrldispidMessage = 1L,dispidXPos = 2L,dispidYPos = 3L,dispidMessageLen = 4L,/AFX_DISP_ID;BEGIN_DISPATCH_MAP(CSample68Ctrl, COleControl/AFX_DISPATCH_MAP(CSample68CtrlDISP_PROPERTY_NOTIFY(CSample68Ctrl, Message, m_message, OnMessageChanged, VT_BSTRDISP_PROPERTY_EX(CSample68Ctrl, XPos, GetXPo
12、s, SetXPos, VT_I2DISP_PROPERTY_EX(CSample68Ctrl, YPos, GetYPos, SetYPos, VT_I2DISP_FUNCTION(CSample68Ctrl, MessageLen, MessageLen, VT_I2, VTS_NONEDISP_STOCKPROP_BACKCOLOR(DISP_STOCKPROP_CAPTION(DISP_STOCKPROP_FORECOLOR(/AFX_DISPATCH_MAPEND_DISPATCH_MAP( 在這里共添加了一個自定義方法MessageLen()和三種庫存屬性BackColor、Cap
13、tion和ForeColor(分別表示控件的背景 色、標(biāo)題和前臺色)、兩個以Get/Set方式獲取的自定義屬性XPos、YPos和一個以成員變量方式實現(xiàn)的自定義屬性Message。這幾個自定義屬 性分別表示要顯示字符串的x、y坐標(biāo)和要顯示的內(nèi)容。對于采取Get/Set方式獲取的屬性,應(yīng)當(dāng)在控件類中為其添加相應(yīng)的成員函數(shù),并修改其Get、 Set成員函數(shù)的實現(xiàn)過程:short m_nYPos;short m_nXPos;short CSample68Ctrl:GetXPos( return m_nXPos;void CSample68Ctrl:SetXPos(short nNewValue m_
14、nXPos = nNewValue;SetModifiedFlag(;short CSample68Ctrl:GetYPos( return m_nYPos;void CSample68Ctrl:SetYPos(short nNewValue m_nYPos = nNewValue;SetModifiedFlag(;對于以成員變量方式創(chuàng)建的屬性Message,向?qū)н€為其生成了一個消息響應(yīng)函數(shù):void CSample68Ctrl:OnMessageChanged( SetModifiedFlag(;只要該屬性的值被更改,OnMessageChanged()函數(shù)即會被調(diào)用。為了使上述屬性設(shè)置如背
15、景色、前景色等能夠與控件實際聯(lián)系起來,需要替換控件類OnDraw()函數(shù)中由向?qū)傻哪遣糠执a。例如,下面這段代碼即以前面添加的屬性設(shè)置作為參數(shù)值,在控件中顯示一串字符:/ 用背景色設(shè)置畫刷CBrush Brush(TranslateColor(GetBackColor(;/ 用前臺色設(shè)置字體顏色pdc-SetTextColor(TranslateColor(GetForeColor(;/ 繪制背景pdc-FillRect(rcBounds, &Brush;/ 設(shè)置字體背景透明pdc-SetBkMode(TRANSPARENT;/ 顯示字符pdc-TextOut(m_nXPos, m_nYP
16、os, m_message;為了使屬性設(shè)置更改后,其效果能夠立即在控件上顯示出來,應(yīng)當(dāng)在與屬性設(shè)置相關(guān)的函數(shù)實現(xiàn)中調(diào)用InvalidateControl()以更新控件的顯示。 可以編譯程序并在ActiveX Control Test Container工具中對其進行測試。在插入控件后,通過Invoke Methods菜單項彈出如圖7所示的對話框。在Method Name組合框中可以選擇要測試的屬性和方法。其中,對于屬性的測試分別有ProgGet和ProgSet的說明以指出是對屬性值的獲取與設(shè)置。在 Parameter編輯框中輸入要設(shè)置的參數(shù)及其對應(yīng)的參數(shù)類型,點擊SetValue按鈕將把該參數(shù)
17、值添加到參數(shù)列表框,最后點擊Invoke按鈕將在 控件應(yīng)用設(shè)置的屬性并執(zhí)行指定的方法。對于有返回值的方法,其執(zhí)行結(jié)果將在Return編輯框中顯示。如果出現(xiàn)了異常操作,在Exception編輯框中 將會顯示出相應(yīng)的異常錯誤信息。圖8給出了經(jīng)過屬性設(shè)置的控件界面。圖7 對屬性、方法的測試圖8 設(shè)置了屬性后的控件 對于控件屬性的添加,在MFC ClassWizard對話框的ActiveX Events頁中通過Add Event按鈕彈出如圖9所示的Add Event事件添加對話框。與方法、屬性的添加類似,在External name組合框中可以輸入要添加的自定義事件名稱,也可以從下拉列表選擇庫存事件。
18、Implementation項將根據(jù)所要添加的事件類型而自動設(shè)置 Stock或Custom選項。ActiveX控件將通過添加的事件來通知容器程序有特定的事件發(fā)生,庫存事件多為鍵盤、鼠標(biāo)事件,將由 COleControl自動進行處理。對于自定義事件,則只是在.odl文件和控件類中添加了事件映射表等必要的代碼(代碼附下),至于應(yīng)當(dāng)在何種條件下 觸發(fā)該事件須由開發(fā)人員自行編寫代碼。圖9 事件的添加dispinterface _DSample68Eventsproperties:/ Event interface has no propertiesmethods:/ NOTE - ClassWizar
19、d will maintain event information here./ Use extreme caution when editing this section./AFX_ODL_EVENT(CSample68Ctrlid(1 void MsgOut(;/AFX_ODL_EVENT;/ Event maps/AFX_EVENT(CSample68Ctrlvoid FireMsgOut(FireEvent(eventidMsgOut,EVENT_PARAM(VTS_NONE;/AFX_EVENTDECLARE_EVENT_MAP(/ Dispatch and event IDspub
20、lic:enum /AFX_DISP_ID(CSample68CtrleventidMsgOut = 1L,/AFX_DISP_ID;BEGIN_EVENT_MAP(CSample68Ctrl, COleControl/AFX_EVENT_MAP(CSample68CtrlEVENT_CUSTOM(MsgOut, FireMsgOut, VTS_NONE/AFX_EVENT_MAPEND_EVENT_MAP( 上述代碼添加了一個MsgOut的自定義事件,可以在通過調(diào)用FireMsgOut()來激發(fā)。下面對Message屬性的 OnMessageChanged()消息響應(yīng)函數(shù)進行修改,每當(dāng)Mes
21、sage屬性內(nèi)容被更改都會調(diào)用該函數(shù),在該函數(shù)中調(diào)用此前添加的 MessageLen()方法以確定更改后的Message屬性的字符串長度,在長度大于10時調(diào)用FireMsgOut()觸發(fā)MsgOut事件:void CSample68Ctrl:OnMessageChanged( InvalidateControl(;if (MessageLen( = 10FireMsgOut(;SetModifiedFlag(;圖10 選擇要記錄的事件 在用ActiveX Control Test Container對剛添加的事件進行測試時,首先通過Control菜單下的Logging菜單項彈出如圖10所示的對
22、話框,并 從Events屬性頁中選中要跟蹤記錄的事件。當(dāng)通過Invoke Methods對話框設(shè)置Message屬性的內(nèi)容超過10個字符后,位于程序框架下方的分割視圖將記錄控件所觸發(fā)的MsgOut事件(如圖11所示)。圖11 對事件的測試實現(xiàn)屬性表屬性表是ActiveX控件所特有的一種技術(shù),可以在包容器程序處于設(shè)計階段時為其提供一個可視化的人機交 互界面,并可以通過其對控件的自定義屬性和庫存屬性進行設(shè)置。在用向?qū)沙绦蚩蚣艿耐瑫r即已經(jīng)生成了一個空的用于管理自定義屬性的屬性頁。在代碼上通過 控件類實現(xiàn)文件中的屬性頁ID表對其進行維護:BEGIN_PROPPAGEIDS(CSample68Ctr
23、l, 1PROPPAGEID(CSample68PropPage:guidEND_PROPPAGEIDS(CSample68Ctrl 這里的CSample68PropPage類是從COlePropertyPage派生出來的,而COlePropertyPage的基類又是 CDialog,因此不難發(fā)現(xiàn)CSample68PropPage與通常的對話框類是比較相似的??梢韵筇幚韺υ捒蛞粯釉谫Y源視圖中為缺省的屬性頁添加與 自定義屬性相關(guān)的交互用控件,并通過ClassWizard將這些控件與類成員變量建立綁定關(guān)系。但是有一點不同,就是在綁定成員變量時還要與控件中的相 應(yīng)屬性建立起對應(yīng)關(guān)系。如圖12所示,在
24、Optional property name組合框中輸入自定義屬性名或是直接從下拉列表選擇庫存屬性名,ClassWizard向?qū)⒃趯傩皂擃惖腄oDataExchange()函數(shù)中 添加控件、變量和屬性的綁定代碼:void CSample68PropPage:DoDataExchange(CDataExchange* pDX/AFX_DATA_MAP(CSample68PropPageDDP_Text(pDX, IDC_MESSAGE, m_sMessage, _T(Message ;DDX_Text(pDX, IDC_MESSAGE, m_sMessage;DDP_Text(pDX, IDC
25、_TITLE, m_sCaption, _T(Caption ;DDX_Text(pDX, IDC_TITLE, m_sCaption;DDP_Text(pDX, IDC_XPOS, m_nXPos, _T(XPos ;DDX_Text(pDX, IDC_XPOS, m_nXPos;DDP_Text(pDX, IDC_YPOS, m_nYPos, _T(YPos ;DDX_Text(pDX, IDC_YPOS, m_nYPos;/AFX_DATA_MAPDDP_PostProcessing(pDX;圖12 成員變量、控件與屬性的綁定 這里只是在向?qū)傻娜笔傩皂撝袑崿F(xiàn)了自定義屬性的可視化設(shè)置
26、。雖然也可以用相同的方法為庫存屬性進行設(shè)置,但是更多的還是采用添加庫存屬性頁ID的 方法來直接使用庫存屬性頁來對其進行維護。例如,對于庫存屬性BackColor和ForeColor,可以通過ID號為 CLSID_CcolorPropPage的庫存屬性頁來進行設(shè)置,在將其添加到屬性頁ID表的同時一定要注意修改 BEGIN_PROPPAGEIDS()宏的屬性頁計數(shù),否則將會引起系統(tǒng)的崩潰:BEGIN_PROPPAGEIDS(CSample68Ctrl, 2PROPPAGEID(CSample68PropPage:guidPROPPAGEID(CLSID_CColorPropPageEND_PROP
27、PAGEIDS(CSample68Ctrl 繼續(xù)在ActiveX Control Test Container中測試控件,將其插入后選擇Edit菜單的Properties菜單項,將彈出入圖13所示的屬性表。該屬性表共有三個屬性 頁,其中第一個屬性頁為剛才編輯的自定義屬性頁,第二個屬性頁(如圖14所示)即為CLSID_CcolorPropPage所指定的顏色屬性頁(為庫存 屬性頁),最后一個屬性頁則是向?qū)ё詣犹砑拥臄U展屬性頁。在屬性表中設(shè)置了相應(yīng)的屬性后,點擊應(yīng)用按鈕即可讓控件使用新的屬性。這與在Invoke Methods對話框中所完成的功能一樣,但顯然要方便的多。而且在包容器程序的設(shè)計階段,
28、也是通過該屬性表來完成控件與客戶的屬性設(shè)置交互的。圖13 控件的屬性表圖14 顏色屬性頁在包容程序中使用ActiveX控件對于ActiveX控件的包容器程序,并不需要象使用OLE文檔服務(wù)器或ActiveX文檔服務(wù)器對象那樣編寫特定的包容器程序框架,直接將控件添加到工程并在對話框上創(chuàng)建即可對其進行使用。 通過Project菜單下的Add To Project菜單項彈出的Components and Controls子菜單項打開一個Components and Controls Gallery對話框,進入到Registered ActiveX Controls目錄下,選取前面創(chuàng)建的ActiveX控件,并將其添加到工程。向?qū)诠こ讨刑砑右粋€關(guān)于此ActiveX控件的包裝類,并 在Controls工具欄中添加一個表示此控件的圖標(biāo)??梢韵笫褂闷渌臉?biāo)準(zhǔn)控件一樣將其放置到對話框資源中,并修改其缺省屬性。除此之外,還可以在 程序中通過對控件包裝類成員函數(shù)的使用來動態(tài)更改控件的屬性設(shè)置。例如,下面這段代碼通過包裝類對象m_ctrlTest在程序運行期間動態(tài)設(shè)置了控件的 XPos、YPos 以及Message屬性:/ 更新顯示UpdateData(;/ 動態(tài)更改控件的Message屬性m_ctr
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 行進間運球的教案(錦集5篇)
- 大班教案(合集六篇)
- 2025年度物業(yè)管理財務(wù)審計合同3篇
- 2024遠(yuǎn)程教育服務(wù)平臺運營合作合同
- 2025年糧食援助計劃課件
- 二零二五年度建筑工人勞動權(quán)益保護及監(jiān)督合同書3篇
- 學(xué)生健康成長的助力器-校園健身區(qū)域規(guī)劃探討
- 二零二五年度景區(qū)食堂承包服務(wù)協(xié)議3篇
- 小學(xué)生預(yù)防同學(xué)矛盾教育
- 2024資產(chǎn)購買合同協(xié)議書(含無形資產(chǎn))
- 2025年集體經(jīng)濟發(fā)展計劃
- 房地產(chǎn)銷售主管崗位招聘筆試題及解答(某大型央企)2024年
- 足球D級教練員培訓(xùn)匯報
- 巖溶區(qū)水文地質(zhì)參數(shù)研究-洞察分析
- 大學(xué)體育與健康 教案全套 體育舞蹈 第1-16周
- 一年級數(shù)學(xué)練習(xí)題-20以內(nèi)加減法口算題(4000道)直接打印版
- 施工作業(yè)安全管理規(guī)定(4篇)
- 浙江省金華市(2024年-2025年小學(xué)五年級語文)人教版質(zhì)量測試((上下)學(xué)期)試卷及答案
- 傳媒行業(yè)突發(fā)事件應(yīng)急預(yù)案
- 2024年《工會法》知識競賽題庫及答案
- 《中國血脂管理指南》考試復(fù)習(xí)題庫(含答案)
評論
0/150
提交評論