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