5.屬性 屬性是 ActiveX 控件中向所有容器公開的數(shù)據(jù)成員。與事件和方法類似,也分為常用屬性和自定義屬性。 常用屬性 常用屬性已由 COleControl 類實(shí)現(xiàn)。COleControl 類包含支持控件的通用屬性的預(yù)定義成員函數(shù)。某些通用屬性包括控件的標(biāo)題以及前景色和背景色。 添加常用屬性的操作是在類視圖中打開庫節(jié)點(diǎn),在本例中就是activexdemo1Lib節(jié)點(diǎn)。選中第二個(gè)節(jié)點(diǎn),也就是本例中的_Dactivexdemo1,在右鍵菜單中選擇添加屬性,打開添加屬性向?qū)?。選中實(shí)現(xiàn)類型下的常用,在屬性名下選擇要添加的屬性,比如在此我們選擇的是Caption。 然后在類視圖中就能看到新添加的這個(gè)屬性。 這個(gè)Caption也就是我們?cè)谑褂每丶M(jìn)行開發(fā)的時(shí)候,控件屬性窗口中的那個(gè)Caption屬性。 在開發(fā)環(huán)境中我們可以用控件變量的GetCaption和SetCaption來獲取和設(shè)定控件的這個(gè)屬性。 比如在測(cè)試項(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按鈕的時(shí)候會(huì)顯示控件的Caption名稱對(duì)話框,然后修改名稱,再把修改后的名稱顯示在彈出的對(duì)話框中。 如果是在ActiveX控件測(cè)試容器中的話,我們還是打開調(diào)用方法窗口,在方法名中會(huì)看到Caption(ProPut)和Caption(ProGet)的方法,也就是對(duì)應(yīng)上面的SetCaption 和GetCaption,同樣在這里也可以試著給Caption修改內(nèi)容并獲取修改后的值。 自定義屬性 自定義屬性與常用屬性的區(qū)別在于,自定義屬性未由 COleControl 類實(shí)現(xiàn)。自定義屬性用于將 ActiveX 控件的某個(gè)狀態(tài)或外觀向使用該控件的程序員公開。 添加自定義屬性的操作是在類視圖中打開庫節(jié)點(diǎn),在本例中就是activexdemo1Lib節(jié)點(diǎn)。選中第二個(gè)節(jié)點(diǎn),也就是本例中的_Dactivexdemo1,在右鍵菜單中選擇添加屬性,打開添加屬性向?qū)?。這里自定義屬性有成員變量和Get/Set方法兩種。 成員變量屬性 我們先看一下成員變量這種屬性。根據(jù)需要選擇屬性的類型,并填入屬性名,同時(shí)變量名和通知函數(shù)會(huì)被自動(dòng)填入,如不滿意默認(rèn)的名稱也可以手動(dòng)修改這兩個(gè)名稱。 其中這個(gè)變量名是作為控件類的一個(gè)成員變量來存儲(chǔ)控件屬性的,比如選中類視圖中的的控件類,也就是Cactivexdemo1Ctrl,就會(huì)在下面看到這個(gè)m_MyProp1成員變量。 這種自定義屬性的使用與常用屬性類似,在ActiveX控件測(cè)試容器中也是有著MyProp1(ProPut)和MyProp1 (ProGet)這樣的方法以供測(cè)試時(shí)調(diào)用,在開發(fā)時(shí)也會(huì)有屬性出現(xiàn)在控件的屬性窗口中,在程序中也是可以通過GetMyProp1和SetMyProp1來獲取和設(shè)置屬性值。 而通知函數(shù)是當(dāng)這個(gè)屬性被修改是所觸發(fā)的一個(gè)函數(shù)。被定義為控件類中的一個(gè)成員函數(shù)。 舉個(gè)例子,假如我們?cè)谶@個(gè)函數(shù)中寫入如下代碼: void Cactivexdemo1Ctrl::OnMyProp1Changed(void) { AFX_MANAGE_STATE(AfxGetStaticModuleState());
// TODO: 在此添加屬性處理程序代碼 MessageBox(_T(“MyProp1 Changed.”));
SetModifiedFlag(); } 然后在ActiveX控件測(cè)試容器中調(diào)用MyProp1(PropPut)來修改這個(gè)屬性值,則會(huì)彈出這個(gè)對(duì)話框。同樣的,在開發(fā)時(shí)如果在屬性窗口中修改此屬性值或在代碼里修改此屬性值都會(huì)觸發(fā)這個(gè)通知函數(shù),進(jìn)而彈出我們代碼中的對(duì)話框。 Get/Set方法型屬性 添加Get/Set方法型屬性則是在添加屬性向?qū)Т翱谥械膶?shí)現(xiàn)類型中選中Get/Set方法,指定屬性類型和屬性名,向?qū)?huì)自動(dòng)填入Get和Set函數(shù),同時(shí)可以指定自定義的參數(shù)。 然后在控件類的定義中就會(huì)出現(xiàn)GetMyProp2(void)和SetMyProp2(LPCTSTR newVal)兩個(gè)函數(shù),分別用于獲取和設(shè)置屬性值。但要注意的是,如果看一下這兩個(gè)函數(shù)的代碼的話,這兩個(gè)自動(dòng)生成的函數(shù)實(shí)際上并沒有真正起到獲取和設(shè)置屬性值的功能,這只是兩個(gè)框架,基本上什么也沒做,如果放在ActiveX控件測(cè)試容器中調(diào)用這兩個(gè)函數(shù)的話會(huì)看不到什么反應(yīng),于是就還需要我們來手動(dòng)定義函數(shù)的具體功能。 比如說我們可以為控件類添加一個(gè)成員變量用來存儲(chǔ)我們的屬性值,由于我們這個(gè)屬性定義的是BSTR類型,我們可以把添加的這個(gè)成員變量聲明為CString m_MyProp2,然后分別修改GetMyProp2(void)和SetMyProp2(LPCTSTR newVal)為如下: BSTR Cactivexdemo1Ctrl::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(); } 然后在ActiveX控件測(cè)試容器中先調(diào)用SetMyProp2給屬性賦值,然后用GetMyProp2就能返回剛才新賦的屬性值了。 另外要注意的是,剛才定義這個(gè)屬性的時(shí)候,參數(shù)列表是留空的,默認(rèn)得到的就是上面SetMyProp2和GetMyProp2兩個(gè)函數(shù),如果在參數(shù)列表里添加了其他參數(shù)的話,那么新加的參數(shù)就會(huì)被添加到這兩個(gè)函數(shù)的參數(shù)列表中去。比如我們添加個(gè)BSTR型屬性MyProp3,在參數(shù)列表里加上一個(gè)LONG arg參數(shù),那么得到的兩個(gè)函數(shù)將是GetMyProp3(LONG arg)和SetMyProp3(LONG arg, BSTR newVal)。 |
|