共用方式為


MFC ActiveX 控制件:新增自訂屬性

自定義屬性與庫存屬性不同,因為類別尚未實作 COleControl 自定義屬性。 自訂屬性可用來使用控件向程式設計人員公開 ActiveX 控件的特定狀態或外觀。

本文說明如何使用 [新增屬性精靈] 將自定義屬性新增至ActiveX控件,並說明產生的程式代碼修改。 主題包括:

自定義屬性有四個實作品種:成員變數、具有通知的成員變數、Get/Set 方法,以及參數化。

  • 成員變數實作

    這個實作會將屬性的狀態表示為控件類別中的成員變數。 當不知道屬性值何時變更時,請使用 Member Variable 實作。 在這三種類型中,這個實作會為 屬性建立最少的支援碼。 用於成員變數實作的分派項目巨集是 DISP_PROPERTY

  • 具有通知實作的成員變數

    此實作包含成員變數和新增屬性精靈所建立的通知函式。 屬性值變更之後,架構會自動呼叫通知函式。 當您需要在屬性值變更後收到通知時,請使用具通知功能的成員變數實現方式。 此實作需要更多時間,因為它需要函數調用。 此實作的分派對應項目巨集為 DISP_PROPERTY_NOTIFY

  • 取得/設定方法實作

    這個實作是由控件類別中的一對成員函式所組成。 當控件的使用者要求屬性的目前值時,Get/Set 方法實作會自動呼叫 Get 成員函式,而當控件的使用者要求變更屬性時,就會自動呼叫 Set 成員函式。 當您需要在運行時間計算屬性值、在變更實際屬性之前驗證控件使用者所傳遞的值,或實作唯讀屬性類型,請使用這個實作。 這個實作的分派對應專案條目巨集是 DISP_PROPERTY_EX。 下一節 使用 [新增屬性精靈] 來新增自定義屬性,使用 CircleOffset 自定義屬性來示範此實作。

  • 參數化實作

    [新增屬性精靈] 支持參數化實作。 參數化屬性(有時稱為屬性陣列)可用來透過控制項的單一屬性來存取一組值。 針對這個實作的調度對應所使用的巨集是 DISP_PROPERTY_PARAM。 如需實作此類型的詳細資訊,請參閱 ActiveX 控件:進階主題一文中的 實作參數化屬性

使用 [新增屬性精靈] 新增自定義屬性

下列程式示範如何新增使用 Get/Set 方法實作的自定義屬性 CircleOffset。 CircleOffset 自定義屬性允許控制項的使用者將圓形從控制項邊界矩形的中心進行偏移。 在未使用 Get/Set 方法的情況下,新增自訂屬性的程序非常類似。

這個相同的程式也可以用來新增您想要的其他自定義屬性。 以您的自定義屬性名稱取代 CircleOffset 屬性名稱和參數。

使用 [新增屬性精靈] 新增 CircleOffset 自定義屬性

  1. 載入您的控件專案。

  2. 在 [類別檢視視圖] 中,展開控制項的程式庫節點。

  3. 以滑鼠右鍵單擊控件的介面節點(連結庫節點的第二個節點),以開啟快捷方式功能表。

  4. 從快捷方式功能表中,按兩下 [ 新增 ],然後按下 [ 新增屬性]。

    這會開啟 [新增屬性精靈]。

  5. 在 [ 屬性名稱] 方塊中,輸入 CircleOffset

  6. 針對 實作類型,按 取得/設定方法

  7. 在 [ 屬性類型] 方塊中,選取 short

  8. 輸入 Get 和 Set Functions 的唯一名稱,或接受預設名稱。

  9. 按一下完成

新增自訂屬性的屬性精靈變更

當您新增 CircleOffset 自訂屬性時,新增屬性精靈會變更控制類別中的標頭 (.H) 和實作 (.CPP) 檔案。

將以下幾行新增至 .H 檔案以宣告兩個名稱為 GetCircleOffsetSetCircleOffset 的函式:

SHORT GetCircleOffset(void);
void SetCircleOffset(SHORT newVal);

下列這一行會新增至控制件的 。IDL 檔案:

[id(2), helpstring("property CircleOffset")] SHORT CircleOffset;
[id(3), helpstring("property MyProperty")] SHORT MyProperty;

這一行會指派 CircleOffset 屬性特定的標識碼,從方法的位置和 [新增屬性精靈] 的屬性清單中取得。

此外,將下列這一行新增到控制類別的 .CPP 檔案中的派發映射,以將 CircleOffset 屬性對應到控制項的兩個處理函數:

DISP_PROPERTY_EX_ID(CMyAxUICtrl, "CircleOffset", dispidCircleOffset, GetCircleOffset, SetCircleOffset, VT_I2)

最後,GetCircleOffsetSetCircleOffset 函式的實作會新增到控制項的 .CPP 檔案的結尾。 在大部分情況下,您將修改 Get 函式以傳回 屬性的值。 Set 函式通常會包含應該在屬性變更之前或之後執行的程式代碼。

void CMyAxUICtrl::SetCircleOffset(SHORT /*newVal*/)
{
   AFX_MANAGE_STATE(AfxGetStaticModuleState());

   // TODO: Add your property handler code here

   SetModifiedFlag();
}

請注意,新增屬性精靈會自動將呼叫 SetModifiedFlag 新增至 Set 函式的主體。 呼叫此函式會將控件標示為已修改。 如果控件已修改,則會在儲存容器時儲存其新狀態。 每當屬性作為控件的持久狀態的一部分保存並變更其值時,應呼叫此函式。

另請參閱

MFC ActiveX 控制件
MFC ActiveX 控件:屬性
MFC ActiveX 控制件:方法
COleControl 類別