共用方式為


MFC ActiveX 控制件:在 ActiveX 控制件中使用圖片

本文說明常見的圖片類型,以及如何在 ActiveX 控件中實作它。 主題包括:

自訂圖片屬性概觀

圖片類型是一些 ActiveX 控制項通用的其中一組類型。 圖片類型會處理元檔、點陣圖或圖示,並允許使用者指定要顯示在 ActiveX 控制件中的圖片。 自定義圖片屬性是使用圖片物件和 Get/Set 函式來實作,以允許控件使用者存取 Picture 屬性。 使用者透過預設的圖片屬性頁面存取自定義圖片屬性。

除了標準圖片類型之外,也可以使用字型和色彩類型。 如需在 ActiveX 控制件中使用標準字型類型的詳細資訊,請參閱 MFC ActiveX 控制件:使用字型一文。

ActiveX 控件類別提供數個元件,可用來在控件內實作 Picture 屬性。 這些元件包括:

  • CPictureHolder 類別。

    這個類別可讓您輕鬆存取自定義 Picture 屬性所顯示項目的圖片物件和功能。

  • 支援使用 Get/Set 函式實作的 LPPICTUREDISP 類型屬性。

    使用類別檢視,您可以快速新增支援圖片類型的自定義屬性或屬性。 如需使用類別檢視新增 ActiveX 控制件屬性的詳細資訊,請參閱 MFC ActiveX 控制件:屬性一文。

  • 用於操作控制項 Picture 屬性的屬性頁面。

    這個屬性頁是 ActiveX 控制項可用的預設屬性頁群組的一部分。 如需 ActiveX 控制項屬性頁的詳細資訊,請參閱 MFC ActiveX 控制項:使用預設屬性頁 一文

在 ActiveX 控制件中實作自訂圖片屬性

當您完成本節中所述的步驟時,控件可以顯示其使用者選擇的圖片。 使用者可以使用顯示目前圖片的屬性頁面來變更顯示的圖片,並具有 [流覽] 按鈕,讓用戶選取不同的圖片。

自定義 Picture 屬性是使用類似於實作其他屬性的程式來實作,主要差異在於自定義屬性必須支援 Picture 類型。 因為 Picture 屬性的項目必須由 ActiveX 控件繪製,所以必須先對屬性進行一些新增和修改,才能完全實作。

若要實作自定義 Picture 屬性,您必須執行下列動作:

控制專案的新增內容

若要新增標準 Picture 屬性頁的屬性頁識別碼,請在控制項實作檔(.CPP)中的 BEGIN_PROPPAGEIDS 宏後插入下列這一行。

PROPPAGEID(CLSID_CPicturePropPage)

您也必須將BEGIN_PROPPAGEIDS巨集的 count 參數遞增一個。 下列內容說明這一點:

BEGIN_PROPPAGEIDS(CMyAxPicCtrl, 2)

若要將數據 CPictureHolder 成員新增至控件類別,請在控件頭檔 () 中控件類別宣告的受保護區段下插入下一行。H):

CPictureHolder    m_pic;

不需要將您的數據成員命名 為 m_pic;任何名稱都已足夠。

接下來,新增支援圖片類型的自訂屬性:

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

  1. 載入控制項的專案。

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

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

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

  5. 在 [ 屬性名稱] 方塊中,輸入屬性名稱。 例如,在此過程中會使用ControlPicture作為範例。

  6. 在 [ 屬性類型] 方塊中,選取屬性類型的 [IPictureDisp* ]。

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

  8. 輸入 Get 和 Set Functions 的唯一名稱,或接受預設名稱。 (在此範例中,會使用預設名稱GetControlPictureSetControlPicture。)

  9. 按一下完成

[新增屬性精靈] 會在控制項標頭檔案 (.H) 中的分派對應註解之間新增下列程式代碼。

IPictureDisp* GetControlPicture(void);
void SetControlPicture(IPictureDisp* pVal);

此外,下列程式代碼會插入控制項實作的分派對應中 (.CPP) 檔案:

DISP_PROPERTY_EX_ID(CMyAxPicCtrl, "ControlPicture", dispidControlPicture,
   GetControlPicture, SetControlPicture, VT_PICTURE)

[新增屬性精靈] 也會在控件實作檔中新增下列兩個存根函式:

IPictureDisp* CWizardGenCtrl::GetControlPicture(void)
{
   AFX_MANAGE_STATE(AfxGetStaticModuleState());

   // TODO: Add your dispatch handler code here

   return NULL;
}

void CWizardGenCtrl::SetControlPicture(IPictureDisp* /*pVal*/)
{
   AFX_MANAGE_STATE(AfxGetStaticModuleState());

   // TODO: Add your property handler code here

   SetModifiedFlag();
}

備註

您的控件類別和函式名稱可能與上述範例不同。

對控件專案的修改

在對控件專案進行必要的新增之後,您必須修改數個會影響 ActiveX 控件轉譯的函式。 這些函式、 OnResetStateOnDraw和自定義 Picture 屬性的 Get/Set 函式位於控件實作檔中。 (請注意,在此範例中,控件類別稱為 CSampleCtrlCPictureHolder 數據成員稱為 m_pic,而自定義圖片屬性名稱為 ControlPicture

在控件 OnResetState 函式中,於 呼叫 COleControl::OnResetState之後新增下列選擇性行:

m_pic.CreateEmpty();
m_pic.CreateEmpty();

這會將控件的圖片設定為空白圖片。

若要正確繪製圖片,請在控件函式中呼叫 OnDraw。 將您的函式修改為類似下列範例:

void CMyAxPicCtrl::OnDraw(CDC* pdc, const CRect& rcBounds, const CRect& /*rcInvalid*/)
{
   if (!pdc)
      return;

   m_pic.Render(pdc, rcBounds, rcBounds);
}

在控件自定義圖片屬性的 Get 函式中,新增下列這一行:

return m_pic.GetPictureDispatch();
return m_pic.GetPictureDispatch();

在控件自定義 Picture 屬性的 Set 函式中,新增下列幾行:

m_pic.SetPictureDispatch(pVal);
InvalidateControl();

圖片屬性必須持久化,才能確保在設計階段新增的資訊會在運行時顯示出來。 將下列這一行新增至 COleControl衍生類別的 DoPropExchange 函數:

PX_Picture(pPX, _T("ControlPicture"), m_pic);

備註

您的類別和函式名稱可能與上述範例不同。

完成修改之後,請重建專案以併入自定義 Picture 屬性的新功能,並使用測試容器來測試新的屬性。 如需測試容器存取方法的詳細資訊,請參閱 以測試容器測試屬性和事件

另請參閱

MFC ActiveX 控制件
MFC ActiveX 控制件:使用字型
MFC ActiveX 控件:屬性頁