版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、基于MFC的ActiveX控件開發(fā)ysmActiveX 控件是基于組件對象模型 (COM) 的可重用軟件組件,廣泛應(yīng)用于桌面及Web應(yīng)用中。在VC下ActiveX控件的開發(fā)可以分為三種,一種是直接用COM的API來開發(fā),這樣做顯然非常的麻煩,對程序員要求也非常高,因此一般是不予考慮的;一種是基于傳統(tǒng)的MFC,采用面向?qū)ο蟮姆绞綄OM的基本功能封裝在若干MFC的C+類中,開發(fā)者通過繼承這些類得到COM支持功能。MFC為廣大VC程序員所熟悉,易于上手學(xué)習(xí),但缺點(diǎn)是MFC封裝的東西比較多,因此用MFC開發(fā)出來的控件相對會比較大,因此比較適于開發(fā)桌面ActivexX控件,尤其是有GUI界面的控件。第
2、三種就是基于ATL的,ATL可以說是專門面向COM開發(fā)的一套框架,使用了C+的模板技術(shù),在運(yùn)行時不需要依賴于類似MFC程序所需要的龐大的代碼模塊,更適合于Web應(yīng)用開發(fā)。本文介紹的是采用第二種方式,即應(yīng)用MFC進(jìn)行桌面可視控件開發(fā)的方法步驟,開發(fā)環(huán)境則是基于VC2005。1.創(chuàng)建控件項(xiàng)目打開VC2005后,我們要先創(chuàng)建一個項(xiàng)目,在新建項(xiàng)目頁的左側(cè)選擇Visual C+-MFC,在右側(cè)選擇MFC ActiveX控件,填上解決方案和項(xiàng)目名稱,比如在這里我的項(xiàng)目名稱是activexdemo1,解決方案名稱是activexdemo。然后進(jìn)入控件向?qū)ы?,在向?qū)У牡诙撚袀€運(yùn)行時許可證,選中這個的話會在生
3、成控件的同時生成一個許可證文件,其他用戶在使用這個控件的時候必須同時附有這個許可證,在此我們保持默認(rèn)狀態(tài),不選。下一頁是關(guān)于項(xiàng)目中各部分的命名問題,可以根據(jù)需要自定義,這里就按默認(rèn)的情況不做修改了。下一頁是選擇控件基于哪種控件的擴(kuò)展以及控件的一些基本特性。如果新建的控件是基于某種特定控件的話,就在創(chuàng)建的控件基于下選擇所要繼承的控件名,否則就保持none。下方的附加功能根據(jù)實(shí)際需要進(jìn)行選擇,并且可以將鼠標(biāo)放置于選項(xiàng)上方,功能的說明會自動顯示在動態(tài)出現(xiàn)的小提示信息窗口中。選擇完畢點(diǎn)擊完成,向?qū)Ь透鶕?jù)你的選擇生成新項(xiàng)目。進(jìn)入開發(fā)環(huán)境,我們可以先看一下類視圖。其中的Cactivexdemo1App是我
4、們這個控件的主程序模塊,定義了控件的注冊(DllRegisterServer)、刪除(DllUnregisterServer)等功能,一般不用動,如有需要我們可以在其中的InitInstance和ExitInstance中定義我們自己的初始化和終止操作代碼,一般也就是一些資源的初始化和銷毀工作。Caxtivexdemo1Ctrl是控件類,我們要做的控件功能基本上就是要在這個類中實(shí)現(xiàn)。 需要提一下的是在這個類中重寫了父類的OnDraw函數(shù),有如下兩句代碼:pdc->FillRect(rcBounds,CBrush:FromHandle(HBRUSH)GetStockObject(WHITE
5、_BRUSH);pdc->Ellipse(rcBounds);也就是在控件上畫了一個橢圓,實(shí)際控件開發(fā)中可以根據(jù)功能需要修改重寫這個函數(shù)來繪制控件界面。Caxtivexdemo1PropPage是屬性頁類,這個類實(shí)現(xiàn)了一個在開發(fā)時設(shè)定控件屬性的對話框。activexdemo1Lib是為客戶程序提供本控件的屬性、方法以及可能響應(yīng)的事件的接口的庫節(jié)點(diǎn),在添加控件的這些功能的時候會用得到。2.生成并測試控件好,現(xiàn)在我們就可以先來生成一下這個項(xiàng)目,當(dāng)然到目前我們只是用系統(tǒng)自動生成的一個控件項(xiàng)目,什么功能都沒有,只是一個空框架。幾秒鐘后,項(xiàng)目應(yīng)該是順利生成??丶脖蛔詣幼缘较到y(tǒng)中去。那怎么才能測
6、試一下這個控件呢?當(dāng)然你可以再建個新項(xiàng)目,比如一個對話框程序,在對話框資源編輯窗口中右邊的工具箱里鼠標(biāo)右鍵菜單里點(diǎn)選擇項(xiàng)。從彈出窗口中的COM組件下找到我們剛剛生成的這個控件,打勾選中。然后在工具箱里就會出現(xiàn)這個控件。然后用鼠標(biāo)拖到對話框里就能用這個控件了。除了這種方法,VS還提供了一種簡便的控件測試工具。在VisualStudio中菜單的工具下有個ActiveX控件測試容器。在工具欄里點(diǎn)新控件按鈕。在插入控件對話框中找到并選擇我們的這個控件。然后就能在這個容器中測試控件的各種功能了。3.事件ActiveX 控件使用事件通知容器控件上發(fā)生了某些事情。事件的常見示例包括單擊控件、使用鍵盤輸入數(shù)據(jù)
7、和控件狀態(tài)更改。當(dāng)發(fā)生這些操作時,控件將引發(fā)事件以提醒容器。MFC 支持兩種事件:常用和自定義。常用事件是 COleControl 類自動處理的事件。自定義事件使控件得以在該控件特定的操作發(fā)生時通知容器??丶?nèi)部狀態(tài)發(fā)生更改或收到某個窗口消息即屬于此類事件。常用事件常用事件由 COleControl 類自動引發(fā)。COleControl 包含預(yù)定義成員函數(shù),它們引發(fā)常見操作所導(dǎo)致的事件。一些由 COleControl 實(shí)現(xiàn)的常見操作包括單擊和雙擊控件、鍵盤事件和鼠標(biāo)按鈕狀態(tài)發(fā)生更改。添加常用事件的操作是在類視圖中右擊ActiveX 控件類,比如在此例中就是Caxtivexdemo1Ctrl。在菜
8、單中選擇添加事件,打開添加事件向?qū)?。在添加事件向?qū)е械氖录Q中選擇Click,也就是鼠標(biāo)點(diǎn)擊事件,添加到控件中。然后再選中類視圖中庫節(jié)點(diǎn)下的第三個節(jié)點(diǎn),也就是Dactivexdemo1Events。在下面就能看到我們剛剛添加的這個事件。然后生成新的控件程序,我們來看看測試一下這個新事件。打開上面提到的ActiveX控件測試容器,把這個控件添加進(jìn)來,用鼠標(biāo)點(diǎn)擊控件,就會在程序下方的消息欄中看到activexdemo1 Control: Click這樣的消息,這就是我們添加進(jìn)去的鼠標(biāo)相應(yīng)事件。那在開發(fā)環(huán)境中使用控件的時候是什么樣子的呢?好,像上面提到過的那樣新建一個對話框項(xiàng)目,把控件放到對話框上
9、。選中這個控件,在屬性窗口中的控件事件中就有這個Click事件了,如果在使用控件中需要相應(yīng)鼠標(biāo)點(diǎn)擊事件,就點(diǎn)添加ClickActivexdemo1ctrl1,事件響應(yīng)函數(shù)中添加你需要的功能了。比如像這樣:void CtestMFCDlg:ClickActivexdemo1ctrl1()/ TODO: 在此處添加消息處理程序代碼MessageBox(_T("Hi.");編譯運(yùn)行這個測試程序,點(diǎn)擊控件位置就會彈出帶有Hi.字樣的MessageBox。自定義事件自定義事件與常用事件的區(qū)別在于,自定義事件不由 COleControl 類自動引發(fā)。自定義事件將控件開發(fā)人員確定的某一操
10、作識別為事件。添加常用事件的操作是在類視圖中右擊ActiveX 控件類,比如在此例中就是Caxtivexdemo1Ctrl。在菜單中選擇添加事件,打開添加事件向?qū)?。定義一個叫做MyEvent的事件,事件可以帶參數(shù),比如我們加個BSTR的參數(shù)msg。然后,回到類視圖,這次選中庫節(jié)點(diǎn)下的第三個節(jié)點(diǎn),也就是_Dactivexdemo1Events,在下面就會看到新添加的這個事件。再選中類視圖中的控件類,即Cactivexdemo1Ctrl,下面也會出現(xiàn)一個MyEvent函數(shù)。雙擊這個MyEvent可以看到定義代碼如下:void MyEvent(BSTR msg) FireEvent(eventidM
11、yEvent, EVENT_PARAM(VTS_PI1), msg);這里的這個MyEvent(BSTR msg)函數(shù)就是用于觸發(fā)MyEvent事件用的,什么意思呢,就是說當(dāng)在控件中需要出發(fā)自定義的這個MyEvent的時候調(diào)用這個MyEvent(BSTR msg)就可以了。下面結(jié)合例子看看是怎么回事。比如說我們希望用戶鼠標(biāo)雙擊左鍵的時候觸發(fā)這個事件,就這么來作。選中類視圖中的控件類,即Cactivexdemo1Ctrl,然后在消息窗口中找到WM_LBUTTONDBCLK,添加這個消息的處理函數(shù)。在消息處理函數(shù)中如下修改:void Cactivexdemo1Ctrl:OnLButtonDblCl
12、k(UINT nFlags, CPoint point) / TODO: 在此添加消息處理程序代碼和/或調(diào)用默認(rèn)值MyEvent(_T("HI, MyEvent.");COleControl:OnLButtonDblClk(nFlags, point);這樣每次用戶在雙擊控件的時候就會觸發(fā)我們自定義的MyEvent事件了。然后看一下測試效果。打開ActiveX控件測試容器,添加這個控件,然后雙擊控件,看消息框里出現(xiàn)什么了?由于雙擊自然也就是兩次單擊,所以會同時出現(xiàn)兩種事件。activexdemo1 Control: MyEvent msg=72activexdemo1 Co
13、ntrol: Click打開測試項(xiàng)目,控件的控件事件里就多了一個MyEvent事件。添加一個針對此事件的處理函數(shù)MyEventActivexdemo1ctrl1 (LPCTSTR msg),msg就是我們定義事件時的那個msg參數(shù),在上面的定義中我們是傳遞了一個"HI, MyEvent."字符串消息?,F(xiàn)在看看是不是這個樣子。在MyEventActivexdemo1ctrl1函數(shù)中我們顯示一個MessageBox,把msg參數(shù)打印出來。void CtestMFCDlg:MyEventActivexdemo1ctrl1(LPCTSTR msg)/ TODO: 在此處添加消息處理
14、程序代碼MessageBox(msg);同時注意要把上面常用事件中定義的Click事件的處理函數(shù)ClickActivexdemo1ctrl1注釋掉,然后編譯運(yùn)行程序后雙擊控件就會彈出HI, MyEvent.對話框。也就是說,由于雙擊操作觸發(fā)了我們定義的MyEvent事件,進(jìn)而調(diào)用MyEvent的處理函數(shù)。4.方法方法就是控件開放給用戶使用的一些功能函數(shù),類似于C+的類函數(shù)。控件方法分兩類,一類是常用方法,其實(shí)現(xiàn)由父類COleControl 提供。自定義方法由開發(fā)人員定義,由此向用戶提供自定義的功能實(shí)現(xiàn)。常用方法COleControl 支持兩個常用方法:DoClick 和 Refresh。Ref
15、resh 由控件的用戶調(diào)用,用以立即更新控件的外觀;而調(diào)用 DoClick 是用于引發(fā)控件的 Click 事件。添加常用方法的操作是在類視圖中打開庫節(jié)點(diǎn),在本例中就是activexdemo1Lib節(jié)點(diǎn)。選中第二個節(jié)點(diǎn),也就是本例中的_Dactivexdemo1,在右鍵菜單中選擇添加方法,打開添加方法向?qū)?。在方法名中選擇需要添加的常用方法。比如DoClick。然后在類視圖中選中_Dactivexdemo1,就會在下面看到我們剛才添加的那個常用方法。同時,你也可以在這里看到有一個AboutBox方法,這是系統(tǒng)自動給我們添加進(jìn)去的,功能是顯示一個About窗口,這個窗口可以在項(xiàng)目的資源視圖中的Dia
16、log下找到并編輯。同樣也要驗(yàn)證一下這個新添加的方法。還是打開ActiveX控件測試容器,添加此控件,然后點(diǎn)擊工具欄上的這個紅色方框,也就是調(diào)用方法。在調(diào)用方法對窗口的方法名中選中我們剛添加的這個DoClick方法,然后點(diǎn)擊調(diào)用。還記得這個DoClick是干什么的來著嗎?,對了,它是要引發(fā)Click事件的,上面介紹事件的時候我們已經(jīng)添加了Click這個常用事件了,那么現(xiàn)在調(diào)用DoClick也就是要引發(fā)我們在上面添加的這個Click事件了,于是在測試容器主窗口的消息框中出現(xiàn)了activexdemo1 Control: Click。那么在開發(fā)環(huán)境中是什么效果呢?好,再回到剛才那個測試項(xiàng)目里。我們先
17、在窗體上添加一個按鈕,就叫DoClick,等會用點(diǎn)擊它的方式來調(diào)用DoClick方法。然后為了方便操作,我們先給剛才添加到對話框中的那個控件添加一個綁定的對象變量。鼠標(biāo)右擊控件選擇添加變量。在添加成員變量向?qū)е刑砑优c此控件綁定的控件變量,比如叫做m_activexdemo。然后,雙擊剛才新加到窗體上的那個按鈕,即添加這個按鈕的鼠標(biāo)點(diǎn)擊事件函數(shù)中,如下添加一行代碼,即調(diào)用控件的DoClick方法。void CtestMFCDlg:OnBnClickedButton1()/ TODO: 在此添加控件通知處理程序代碼m_activexdemo.DoClick();最后,編譯運(yùn)行測試程序,點(diǎn)擊DoCl
18、ick按鈕,結(jié)果彈出Hi.對話框。這就是說,我們通過執(zhí)行控件對象的DoClick方法引發(fā)了控件的鼠標(biāo)點(diǎn)擊事件,因此上文常用事件一節(jié)中我們添加的事件處理函數(shù)ClickActivexdemo1ctrl1被執(zhí)行了。自定義方法自定義方法與常用方法的區(qū)別在于,自定義方法未由 COleControl 實(shí)現(xiàn)。必須為添加到控件的每個自定義方法提供實(shí)現(xiàn)。添加自定義方法的操作是在類視圖中打開庫節(jié)點(diǎn),在本例中就是activexdemo1Lib節(jié)點(diǎn)。選中第二個節(jié)點(diǎn),也就是本例中的_Dactivexdemo1,在右鍵菜單中選擇添加方法,打開添加方法向?qū)?。在添加方法向?qū)Ю锾砑有枰远x的方法的名稱、返回值和參數(shù)。注意這里
19、有個內(nèi)部名稱,默認(rèn)情況是與上面的方法名一樣,但是也可以修改為其他名,這個內(nèi)部名稱是方法在控件類內(nèi)的函數(shù)名稱,比如這里我們的方法名為MyThod,則選中類視圖中的庫接口下的第二個節(jié)點(diǎn),下面會出現(xiàn)剛定義的MyMethod方法。而選中控件類Cactivexdemo1Ctrl,下面會看到在這個類中定義的方法名稱就是我們上面指定內(nèi)部名稱MyMethodInner。而方法的具體功能也就是在這個內(nèi)部函數(shù)中實(shí)現(xiàn)。比如我們?nèi)缦露xMyMethodInner: void Cactivexdemo1Ctrl:MyMethodInner(LPCTSTR msg)AFX_MANAGE_STATE(AfxGetStati
20、cModuleState();/ TODO: 在此添加調(diào)度處理程序代碼MessageBox(msg);也就是說要彈出一個消息對話框,消息內(nèi)容就是參數(shù)中傳遞的字符串。然后來測試一下效果,首先還是ActiveX控件測試容器,打開調(diào)用方法窗口,在方法名中會看到我們定一個MyMethod,選擇之,然悔會在參數(shù)區(qū)看到我們定義的msg參數(shù),選中,然后在下面參數(shù)值中填入你想傳遞給參數(shù)的值,比如hello,然后點(diǎn)擊設(shè)置值,最后點(diǎn)擊調(diào)用,MyMethodInner就會被執(zhí)行,也就是彈出hello消息窗口。然后再看一下使用控件開發(fā)的時候的效果?;氐綔y試項(xiàng)目,還記得那個DoClick按鈕吧,還是用這個,不過有點(diǎn)小問
21、題,因?yàn)樯厦嫖覀優(yōu)檫@個控件綁定控件變量的時候還沒有這個自定義方法,所以在綁定的時候生成的控件類定義中沒有這個方法,就無法測試了。為了省事,我們就干脆新建一個項(xiàng)目,像前文提到的那樣添加控件,綁定控件變量,在DoClick的單擊事件中寫入如下代碼:void Ct1Dlg:OnBnClickedButton1()/ TODO: 在此添加控件通知處理程序代碼m_activexdemo.MyMethod(_T("This is mymethod.");編譯執(zhí)行,點(diǎn)擊DoClick按鈕,就會看到那個This is mymethod消息框了。5.屬性屬性是 ActiveX 控件中向所有容
22、器公開的數(shù)據(jù)成員。與事件和方法類似,也分為常用屬性和自定義屬性。常用屬性常用屬性已由 COleControl 類實(shí)現(xiàn)。COleControl 類包含支持控件的通用屬性的預(yù)定義成員函數(shù)。某些通用屬性包括控件的標(biāo)題以及前景色和背景色。添加常用屬性的操作是在類視圖中打開庫節(jié)點(diǎn),在本例中就是activexdemo1Lib節(jié)點(diǎn)。選中第二個節(jié)點(diǎn),也就是本例中的_Dactivexdemo1,在右鍵菜單中選擇添加屬性,打開添加屬性向?qū)?。選中實(shí)現(xiàn)類型下的常用,在屬性名下選擇要添加的屬性,比如在此我們選擇的是Caption。然后在類視圖中就能看到新添加的這個屬性。這個Caption也就是我們在使用控件進(jìn)行開發(fā)的時
23、候,控件屬性窗口中的那個Caption屬性。在開發(fā)環(huán)境中我們可以用控件變量的GetCaption和SetCaption來獲取和設(shè)定控件的這個屬性。比如在測試項(xiàng)目中的DoClick按鈕的點(diǎn)擊事件函數(shù)中如下修改:void Ct1Dlg:OnBnClickedButton1()/ TODO: 在此添加控件通知處理程序代碼MessageBox(m_activexdemo.GetCaption();m_activexdemo.SetCaption(_T("change");MessageBox(m_activexdemo.GetCaption();這樣在點(diǎn)擊DoClick按鈕的時候會
24、顯示控件的Caption名稱對話框,然后修改名稱,再把修改后的名稱顯示在彈出的對話框中。如果是在ActiveX控件測試容器中的話,我們還是打開調(diào)用方法窗口,在方法名中會看到Caption(ProPut)和Caption(ProGet)的方法,也就是對應(yīng)上面的SetCaption 和GetCaption,同樣在這里也可以試著給Caption修改內(nèi)容并獲取修改后的值。自定義屬性自定義屬性與常用屬性的區(qū)別在于,自定義屬性未由 COleControl 類實(shí)現(xiàn)。自定義屬性用于將 ActiveX 控件的某個狀態(tài)或外觀向使用該控件的程序員公開。添加自定義屬性的操作是在類視圖中打開庫節(jié)點(diǎn),在本例中就是acti
25、vexdemo1Lib節(jié)點(diǎn)。選中第二個節(jié)點(diǎn),也就是本例中的_Dactivexdemo1,在右鍵菜單中選擇添加屬性,打開添加屬性向?qū)?。這里自定義屬性有成員變量和Get/Set方法兩種。成員變量屬性我們先看一下成員變量這種屬性。根據(jù)需要選擇屬性的類型,并填入屬性名,同時變量名和通知函數(shù)會被自動填入,如不滿意默認(rèn)的名稱也可以手動修改這兩個名稱。其中這個變量名是作為控件類的一個成員變量來存儲控件屬性的,比如選中類視圖中的的控件類,也就是Cactivexdemo1Ctrl,就會在下面看到這個m_MyProp1成員變量。這種自定義屬性的使用與常用屬性類似,在ActiveX控件測試容器中也是有著MyProp
26、1(ProPut)和MyProp1 (ProGet)這樣的方法以供測試時調(diào)用,在開發(fā)時也會有屬性出現(xiàn)在控件的屬性窗口中,在程序中也是可以通過GetMyProp1和SetMyProp1來獲取和設(shè)置屬性值。而通知函數(shù)是當(dāng)這個屬性被修改是所觸發(fā)的一個函數(shù)。被定義為控件類中的一個成員函數(shù)。舉個例子,假如我們在這個函數(shù)中寫入如下代碼:void Cactivexdemo1Ctrl:OnMyProp1Changed(void)AFX_MANAGE_STATE(AfxGetStaticModuleState();/ TODO: 在此添加屬性處理程序代碼MessageBox(_T("MyProp1 C
27、hanged.");SetModifiedFlag();然后在ActiveX控件測試容器中調(diào)用MyProp1(PropPut)來修改這個屬性值,則會彈出這個對話框。同樣的,在開發(fā)時如果在屬性窗口中修改此屬性值或在代碼里修改此屬性值都會觸發(fā)這個通知函數(shù),進(jìn)而彈出我們代碼中的對話框。Get/Set方法型屬性添加Get/Set方法型屬性則是在添加屬性向?qū)Т翱谥械膶?shí)現(xiàn)類型中選中Get/Set方法,指定屬性類型和屬性名,向?qū)詣犹钊隚et和Set函數(shù),同時可以指定自定義的參數(shù)。然后在控件類的定義中就會出現(xiàn)GetMyProp2(void)和SetMyProp2(LPCTSTR newVal)兩
28、個函數(shù),分別用于獲取和設(shè)置屬性值。但要注意的是,如果看一下這兩個函數(shù)的代碼的話,這兩個自動生成的函數(shù)實(shí)際上并沒有真正起到獲取和設(shè)置屬性值的功能,這只是兩個框架,基本上什么也沒做,如果放在ActiveX控件測試容器中調(diào)用這兩個函數(shù)的話會看不到什么反應(yīng),于是就還需要我們來手動定義函數(shù)的具體功能。比如說我們可以為控件類添加一個成員變量用來存儲我們的屬性值,由于我們這個屬性定義的是BSTR類型,我們可以把添加的這個成員變量聲明為CString m_MyProp2,然后分別修改GetMyProp2(void)和SetMyProp2(LPCTSTR newVal)為如下:BSTR Cactivexdemo
29、1Ctrl:GetMyProp2(void)AFX_MANAGE_STATE(AfxGetStaticModuleState();CString strResult(m_MyProp2);/ TODO: 在此添加調(diào)度處理程序代碼return strResult.AllocSysString();void Cactivexdemo1Ctrl:SetMyProp2(LPCTSTR newVal)AFX_MANAGE_STATE(AfxGetStaticModuleState();/ TODO: 在此添加屬性處理程序代碼m_MyProp2=newVal;SetModifiedFlag();然后在Ac
30、tiveX控件測試容器中先調(diào)用SetMyProp2給屬性賦值,然后用GetMyProp2就能返回剛才新賦的屬性值了。另外要注意的是,剛才定義這個屬性的時候,參數(shù)列表是留空的,默認(rèn)得到的就是上面SetMyProp2和GetMyProp2兩個函數(shù),如果在參數(shù)列表里添加了其他參數(shù)的話,那么新加的參數(shù)就會被添加到這兩個函數(shù)的參數(shù)列表中去。比如我們添加個BSTR型屬性MyProp3,在參數(shù)列表里加上一個LONG arg參數(shù),那么得到的兩個函數(shù)將是GetMyProp3(LONG arg)和SetMyProp3(LONG arg, BSTR newVal)。6.屬性頁屬性頁使 ActiveX 控件用戶得以查
31、看和更改 ActiveX 控件屬性。可通過調(diào)用控件屬性對話框訪問這些屬性。該對話框包含一個或多個屬性頁,這些屬性頁提供自定義的圖形界面用于查看和編輯控件屬性。使用默認(rèn)屬性頁創(chuàng)建ActiveX控件項(xiàng)目后,系統(tǒng)就自動為我們添加了一個屬性頁類,這里就是Cactivexdemo1PropPage。同時在對話框資源里也會有一個屬性頁對話框資源,這里就是IDD_PROPPAGE_ACTIVEXDEMO1。在ActiveX控件測試容器中點(diǎn)擊工具欄上的屬性按鈕,就會看到這個屬性頁對話框。比如就像下圖這樣。當(dāng)然這個上面什么還沒有。如果是在使用控件開發(fā)時,則在選中控件后,在屬性窗口中點(diǎn)擊屬性頁按鈕可以打開這個屬性
32、頁,開發(fā)人員可以在這個彈出的屬性頁窗口中設(shè)定控件的屬性。如果要通過屬性頁修改控件屬性,那么就要通過在屬性頁上放置一些控件給用戶來修改屬性值。比如我們上面添加了一個Caption屬性,我們要在屬性頁上提供修改這個屬性的功能一般就是要用一個文本輸入框。這樣我們在屬性頁的對話框上放置一個Edit控件,設(shè)id為IDC_EDIT_CAPTION。然后為這個Edit控件綁定一個變量。用右鍵點(diǎn)這個Edit控件,學(xué)則添加變量,打開在添加成員變量向?qū)е刑砑右粋€新變量,設(shè)為m_caption,這里注意要把類型設(shè)為Value,由于屬性是個字符串,所以這個地方變量類型也使用CString。然后我們來看一下屬性頁類中的
33、一個DoDataExchange函數(shù)。這個函數(shù)是由系統(tǒng)自動調(diào)用的,用來將控件與成員變量進(jìn)行數(shù)據(jù)交換。由于我們剛把Edit控件綁定了m_caption變量,在DoDataExchange已經(jīng)給我們寫入了這么一句DDX_Text(pDX, IDC_EDIT_CAPTION, m_caption);,就是這一句實(shí)現(xiàn)了m_caption與Edit控件之間的數(shù)據(jù)交換。但此時控件Caption屬性還不能自動從Edit控件中填寫的值獲得,還需要一個操作,即DDP_Text(pDX, IDC_EDIT_CAPTION, m_caption, _T("Caption");,這樣就把Capti
34、on屬性與與屬性頁中的m_caption變量綁定,這樣每當(dāng)我們在修改了屬性頁窗口中的Edit控件內(nèi)容后,就能修改控件的Caption。那么完整的DoDataExchange函數(shù)就應(yīng)該像下面這樣。void Cactivexdemo1PropPage:DoDataExchange(CDataExchange* pDX) DDX_Text(pDX, IDC_EDIT_CAPTION, m_caption);DDP_Text(pDX, IDC_EDIT_CAPTION, m_caption, _T("Caption");DDP_PostProcessing(pDX);另外注意這個地
35、方DDP_PostProcessing是系統(tǒng)自動生成的代碼,這句話一定要放在DDX_Text和DDP_Text的后面,否則不能實(shí)現(xiàn)控件屬性與屬性頁上控件的綁定。至此,我們就可以在設(shè)計時通過這個屬性頁來修改Caption屬性,而不必通過程序代碼來修改了。添加其他自定義屬性頁默認(rèn)情況下只有一個屬性頁,如果需要設(shè)置的屬性太多就需要另外添加自定義屬性頁。 新添加屬性頁的方法是這樣的,打開VS的資源視圖,添加一個新的Dialog資源。在這里我們選擇IDD_OLE_PROPPAGE_SMALL,當(dāng)然也可以選和Large。給這個新資源ID指定為IDD_OLE_PROPPAGE_SMALL。然后需要給這個資源
36、新建一個關(guān)聯(lián)類。這個關(guān)聯(lián)類應(yīng)當(dāng)是MFC類,設(shè)類名為CPropPage1,基類應(yīng)當(dāng)是COlePropertyPage,對話框ID選擇我們新添加的這個對話框資源ID。然后,打開控件類Cactivexdemo1Ctrl的cpp文件,找到屬性頁的宏聲明部分。BEGIN_PROPPAGEIDS(Cactivexdemo1Ctrl, 1)PROPPAGEID(Cactivexdemo1PropPage:guid)END_PROPPAGEIDS(Cactivexdemo1Ctrl)把我們新建的這個屬性頁添加進(jìn)去,并將屬性頁計數(shù)加一。/ TODO: 按需要添加更多屬性頁。請記住增加計數(shù)!BEGIN_PROPPAGEIDS(Cactivexdemo1Ctrl, 2)PROPPAGEID(Cactivexdemo1PropPa
溫馨提示
- 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025版南寧保險行業(yè)勞動合同示范文本2篇
- 濱州學(xué)院《曲式》2023-2024學(xué)年第一學(xué)期期末試卷
- 濱州學(xué)院《材料與工藝》2023-2024學(xué)年第一學(xué)期期末試卷
- 畢節(jié)職業(yè)技術(shù)學(xué)院《商務(wù)英語閱讀3》2023-2024學(xué)年第一學(xué)期期末試卷
- 畢節(jié)醫(yī)學(xué)高等??茖W(xué)?!稇?yīng)用物理化學(xué)實(shí)驗(yàn)》2023-2024學(xué)年第一學(xué)期期末試卷
- 北京中醫(yī)藥大學(xué)東方學(xué)院《中國古代建筑與風(fēng)水地理》2023-2024學(xué)年第一學(xué)期期末試卷
- 2025年度茶葉包裝設(shè)計與生產(chǎn)定制合同3篇
- 三方代理合同定稿
- 2025版預(yù)拌砂漿研發(fā)與技術(shù)轉(zhuǎn)讓合同3篇
- 委托養(yǎng)羊合同
- 超星-《突發(fā)事件及自救互救》-期末考試
- 員工調(diào)崗調(diào)薪申請表
- 《鋁及鋁合金薄板變形量及殘余應(yīng)力測試方法 切縫翹曲法》
- 小學(xué)科學(xué)蘇教版四年級上冊全冊教學(xué)反思(2023秋新課標(biāo)版)
- 診所污水污物糞便處理方案及周邊環(huán)境
- 指揮中心 施工方案
- 金融模擬交易實(shí)驗(yàn)報告
- 國家開放大學(xué)電大本科《古代小說戲曲專題》2023期末試題及答案(試卷號:1340)
- 加德納多元智能理論教學(xué)課件
- 北師大版數(shù)學(xué)八年級上冊全冊教案
- 新開模具清單
評論
0/150
提交評論