共用方式為


MFC ActiveX 控制項:加入自訂屬性

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

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

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

  • 成員變數實作

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

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

    此實作包含成員變數和新增屬性精靈所建立的通知函式。 屬性值變更之後,架構會自動呼叫通知函式。 當您需要在屬性值變更之後收到通知時,請使用 Member Variable 搭配 Notification 實作。 此實作需要更多時間,因為它需要函式呼叫。 這個實作的分派對應專案宏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. 在 [實作類型] 中,按一下 [Get/Set 方法]

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

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

  9. 按一下完成

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

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

下列幾行會新增至 。要宣告兩個稱為 GetCircleOffsetSetCircleOffset 的函式的 H 檔案:

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)

最後,和 SetCircleOffset 函式的 GetCircleOffset 實作會新增至 控制項的 結尾。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 類別