本文說明常見的圖片類型,以及如何在 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 屬性標識碼、類型為
CPictureHolder
的數據成員,以及類型為LPPICTUREDISP且具有 Get/Set 實作的自定義屬性。 -
這些修改將會對負責繪製 ActiveX 控制件的數個函式進行。
控制專案的新增內容
若要新增標準 Picture 屬性頁的屬性頁識別碼,請在控制項實作檔(.CPP)中的 BEGIN_PROPPAGEIDS 宏後插入下列這一行。
PROPPAGEID(CLSID_CPicturePropPage)
您也必須將BEGIN_PROPPAGEIDS巨集的 count 參數遞增一個。 下列內容說明這一點:
BEGIN_PROPPAGEIDS(CMyAxPicCtrl, 2)
若要將數據 CPictureHolder
成員新增至控件類別,請在控件頭檔 () 中控件類別宣告的受保護區段下插入下一行。H):
CPictureHolder m_pic;
不需要將您的數據成員命名 為 m_pic;任何名稱都已足夠。
接下來,新增支援圖片類型的自訂屬性:
使用 [新增屬性精靈] 新增自定義圖片屬性
載入控制項的專案。
在 [類別檢視視圖] 中,展開控制項的程式庫節點。
以滑鼠右鍵單擊控件的介面節點(連結庫節點的第二個節點),以開啟快捷方式功能表。
從快捷方式功能表中,選擇 [ 新增 ],然後選擇 [ 新增屬性]。
在 [ 屬性名稱] 方塊中,輸入屬性名稱。 例如,在此過程中會使用
ControlPicture
作為範例。在 [ 屬性類型] 方塊中,選取屬性類型的 [IPictureDisp* ]。
針對 實作類型,按 取得/設定方法。
輸入 Get 和 Set Functions 的唯一名稱,或接受預設名稱。 (在此範例中,會使用預設名稱
GetControlPicture
和SetControlPicture
。)按一下完成。
[新增屬性精靈] 會在控制項標頭檔案 (.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 控件轉譯的函式。 這些函式、 OnResetState
、 OnDraw
和自定義 Picture 屬性的 Get/Set 函式位於控件實作檔中。 (請注意,在此範例中,控件類別稱為 CSampleCtrl
, CPictureHolder
數據成員稱為 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 屬性的新功能,並使用測試容器來測試新的屬性。 如需測試容器存取方法的詳細資訊,請參閱 以測試容器測試屬性和事件 。