MFC ActiveX 控制項: 將自訂屬性加入
自訂屬性與不同的內建屬性的自訂屬性已非頁面實作的COleControl類別。 自訂屬性用來公開 (expose) 某些州或一種 ActiveX 控制項來為程式設計人員使用控制項的外觀。
這篇文章說明如何將自訂屬性加入至 ActiveX 控制項使用加入屬性精靈,並說明程式碼修改結果。 主題包括:
使用加入屬性精靈來加入自訂屬性
加入屬性精靈針對自訂屬性的變更
自訂屬性可分成四種實作的: 成員變數、 成員變數通知、 Get/Set 方法與使用參數化。
成員變數實作
這項實作以控制項類別中的成員變數來表示屬性的狀態。 當您不一定要知道當屬性值變更時,請使用成員變數實作。 三種類型,這項實作會建立最少量的支援之屬性的程式碼。 分派對應項目巨集的成員變數實作是 DISP_PROPERTY。
使用通知實作的成員變數
這項實作是由成員變數,以及由加入屬性精靈所建立的告知函式所組成。 架構自動呼叫告知函式之後變更屬性值。 成員變數與通知實作時,使用您需要的屬性值已變更後得到告知。 這項實作需要更多的時間,因為它需要函式呼叫。 分派對應項目巨集,此實作是 DISP_PROPERTY_NOTIFY。
取得或設定方法實作
這項實作是由一組在控制項類別的成員函式所組成。 Get/Set 方法實作會自動呼叫 Get 成員函式時,控制項的使用者要求屬性的目前值和集合的成員函式控制項的使用者要求變更屬性時。 當您需要來計算屬性的值在執行期間,驗證傳遞由控制項的使用者才能變更 [實際] 屬性中的值或實作的讀取-或唯寫屬性型別,請使用這項實作。 分派對應項目巨集,此實作是 DISP_PROPERTY_EX。 下列區段中, 使用加入屬性精靈來加入自訂屬性,來示範這項實作會使用 CircleOffset 的自訂屬性。
參數化的實作
參數化的實作是由加入屬性精靈支援的。 參數化的屬性 (有時稱為屬性陣列) 可用來透過您控制項的單一屬性存取一組值。 分派對應項目巨集,此實作是DISP_PROPERTY_PARAM。 如需有關如何實作這種類型的詳細資訊,請參閱實作參數化屬性 ActiveX 控制項 」 文件中: 進階主題。
使用加入屬性精靈來加入自訂屬性
下列程序會示範加入自訂屬性,CircleOffset,會使用 Get/Set 方法實作。 CircleOffset 的自訂屬性可以讓控制項的使用者從控制項的界限矩形的中心圓的位移。 新增自訂屬性,而不是 Get/Set 方法實作的程序都非常類似。
同樣的程序也可用來新增其他您想要的自訂屬性。 以取代您在 CircleOffset 屬性名稱和參數的自訂屬性名稱。
若要加入 CircleOffset 自訂屬性使用加入屬性精靈
載入控制項專案。
在 [類別檢視中,展開您的控制項程式庫節點。
您的控制項 (程式庫節點的第二個節點) 的 [介面] 節點上按一下滑鼠右鍵來開啟快顯功能表。
從快速鍵功能表中,按一下 [ 新增 ,然後按一下 [ 加入屬性。
如此會開啟加入屬性精靈。
在屬性名稱方塊中,輸入CircleOffset。
對於實作類型,按一下 [ Get/Set 方法。
在屬性型別 ] 方塊中選取 短。
輸入您 Get 及 Set 函式的唯一名稱或接受預設名稱。
按一下 [完成]。
加入屬性精靈針對變更自訂屬性
當您將加入 CircleOffset 自訂屬性時,加入屬性精靈會變更標頭檔 (。H) 和實作 (。CPP) 裡的控制項類別的檔案。
加入下列幾行。H 檔案中宣告兩個函式呼叫GetCircleOffset和SetCircleOffset:
SHORT GetCircleOffset(void);
void SetCircleOffset(SHORT newVal);
下面這一行會加入至您的控制項。IDL 檔:
[id(2), helpstring("property CircleOffset")] SHORT CircleOffset;
[id(3), helpstring("property MyProperty")] SHORT MyProperty;
此行會指派特定的 ID 號碼,取自方法和屬性清單中的方法的位置,加入屬性精靈的 [CircleOffset] 屬性。
另外下, 面這一行會加入至分派對應 (在中。CPP 檔中的控制項類別),將 CircleOffset 屬性對應至控制項的兩個處理常式函式:
DISP_PROPERTY_EX_ID(CMyAxUICtrl, "CircleOffset", dispidCircleOffset, GetCircleOffset, SetCircleOffset, VT_I2)
最後,實作的GetCircleOffset和SetCircleOffset函式加入至控制項的結尾。CPP 檔案中。 在大多數情況下,您將修改 Get 函式來傳回屬性的值。 Set 函式通常會包含屬性變更前後應執行的程式碼。
void CMyAxUICtrl::SetCircleOffset(SHORT /*newVal*/)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
// TODO: Add your property handler code here
SetModifiedFlag();
}
請注意加入屬性精靈會將自動新增呼叫,以 SetModifiedFlag,Set 函式的主體。 呼叫這個函式會將控制項的標記,為已修改。 如果控制項已經被修改,則在儲存容器時,將會儲存成新的狀態。 每次儲存為控制項的永續性狀態的一部分的屬性值變更時,應該呼叫這個函式。