1. 程式人生 > >MFC的ActiveX控制元件開發(屬性)

MFC的ActiveX控制元件開發(屬性)

屬性

屬性是 ActiveX 控制元件中向所有容器公開的資料成員。與事件和方法類似,也分為常用屬性和自定義屬性。

常用屬性

常用屬性已由 COleControl 類實現。COleControl 類包含支援控制元件的通用屬性的預定義成員函式。某些通用屬性包括控制元件的標題以及前景色和背景色。

新增常用屬性的操作是在類檢視中開啟庫節點,在本例中就是activexdemo1Lib節點。選中第二個節點,也就是本例中的_Dactivexdemo1,在右鍵選單中選擇新增屬性,開啟新增屬性向導。選中實現型別下的常用,在屬性名下選擇要新增的屬性,比如在此我們選擇的是Caption。

然後在類檢視中就能看到新新增的這個屬性。

這個Caption也就是我們在使用控制元件進行開發的時候,控制元件屬性視窗中的那個Caption屬性。

在開發環境中我們可以用控制元件變數的GetCaption和SetCaption來獲取和設定控制元件的這個屬性。

比如在測試專案中的DoClick按鈕的點選事件函式中如下修改:

void Ct1Dlg::OnBnClickedButton1()

{

// TODO: 在此新增控制元件通知處理程式程式碼

MessageBox(m_activexdemo.GetCaption());

m_activexdemo.SetCaption(_T(”change”));

MessageBox(m_activexdemo.GetCaption());

}

這樣在點選DoClick按鈕的時候會顯示控制元件的Caption名稱對話方塊,然後修改名稱,再把修改後的名稱顯示在彈出的對話方塊中。

如果是在ActiveX控制元件測試容器中的話,我們還是開啟呼叫方法視窗,在方法名中會看到Caption(ProPut)和Caption(ProGet)的方法,也就是對應上面的SetCaption 和GetCaption,同樣在這裡也可以試著給Caption修改內容並獲取修改後的值。

自定義屬性

自定義屬性與常用屬性的區別在於,自定義屬性未由 COleControl 類實現。自定義屬性用於將 ActiveX 控制元件的某個狀態或外觀向使用該控制元件的程式設計師公開。

新增自定義屬性的操作是在類檢視中開啟庫節點,在本例中就是activexdemo1Lib節點。選中第二個節點,也就是本例中的_Dactivexdemo1,在右鍵選單中選擇新增屬性,開啟新增屬性向導。這裡自定義屬性有成員變數和Get/Set方法兩種。

成員變數屬性

我們先看一下成員變數這種屬性。根據需要選擇屬性的型別,並填入屬性名,同時變數名和通知函式會被自動填入,如不滿意預設的名稱也可以手動修改這兩個名稱。

其中這個變數名是作為控制元件類的一個成員變數來儲存控制元件屬性的,比如選中類檢視中的的控制元件類,也就是Cactivexdemo1Ctrl,就會在下面看到這個m_MyProp1成員變數。

這種自定義屬性的使用與常用屬性類似,在ActiveX控制元件測試容器中也是有著MyProp1(ProPut)和MyProp1 (ProGet)這樣的方法以供測試時呼叫,在開發時也會有屬性出現在控制元件的屬性視窗中,在程式中也是可以通過GetMyProp1和SetMyProp1來獲取和設定屬性值。

而通知函式是當這個屬性被修改是所觸發的一個函式。被定義為控制元件類中的一個成員函式。

舉個例子,假如我們在這個函式中寫入如下程式碼:

void Cactivexdemo1Ctrl::OnMyProp1Changed(void)

{

AFX_MANAGE_STATE(AfxGetStaticModuleState());

// TODO: 在此新增屬性處理程式程式碼

MessageBox(_T(”MyProp1 Changed.”));

SetModifiedFlag();

}

然後在ActiveX控制元件測試容器中呼叫MyProp1(PropPut)來修改這個屬性值,則會彈出這個對話方塊。同樣的,在開發時如果在屬性視窗中修改此屬性值或在程式碼裡修改此屬性值都會觸發這個通知函式,進而彈出我們程式碼中的對話方塊。

Get/Set方法型屬性

新增Get/Set方法型屬性則是在新增屬性向導視窗中的實現型別中選中Get/Set方法,指定屬性型別和屬性名,嚮導會自動填入Get和Set函式,同時可以指定自定義的引數。

然後在控制元件類的定義中就會出現GetMyProp2(void)和SetMyProp2(LPCTSTR newVal)兩個函式,分別用於獲取和設定屬性值。但要注意的是,如果看一下這兩個函式的程式碼的話,這兩個自動生成的函式實際上並沒有真正起到獲取和設定屬性值的功能,這只是兩個框架,基本上什麼也沒做,如果放在ActiveX控制元件測試容器中呼叫這兩個函式的話會看不到什麼反應,於是就還需要我們來手動定義函式的具體功能。

比如說我們可以為控制元件類新增一個成員變數用來儲存我們的屬性值,由於我們這個屬性定義的是BSTR型別,我們可以把新增的這個成員變數宣告為CString m_MyProp2,然後分別修改GetMyProp2(void)和SetMyProp2(LPCTSTR newVal)為如下:

BSTR Cactivexdemo1Ctrl::GetMyProp2(void)

{

AFX_MANAGE_STATE(AfxGetStaticModuleState());

CString strResult(m_MyProp2);

// TODO: 在此新增排程處理程式程式碼

return strResult.AllocSysString();

}

void Cactivexdemo1Ctrl::SetMyProp2(LPCTSTR newVal)

{

AFX_MANAGE_STATE(AfxGetStaticModuleState());

// TODO: 在此新增屬性處理程式程式碼

m_MyProp2=newVal;

SetModifiedFlag();

}

然後在ActiveX控制元件測試容器中先呼叫SetMyProp2給屬性賦值,然後用GetMyProp2就能返回剛才新賦的屬性值了。

另外要注意的是,剛才定義這個屬性的時候,引數列表是留空的,預設得到的就是上面SetMyProp2和GetMyProp2兩個函式,如果在引數列表裡添加了其他引數的話,那麼新加的引數就會被新增到這兩個函式的引數列表中去。比如我們添加個BSTR型屬性MyProp3,在引數列表里加上一個LONG arg引數,那麼得到的兩個函式將是GetMyProp3(LONG arg)和SetMyProp3(LONG arg, BSTR newVal)。