步驟 6:將屬性頁
屬性頁會實作為不同的 COM 物件,它們就必須共用。在這個步驟中,您將執行下列工作將屬性頁加入至控制項:
建立資源屬性頁
加入程式碼以建立和管理屬性頁
將屬性頁加入至控制項
建立資源屬性頁
若要將屬性頁加入至控制項,請使用 ATL 加入類別精靈。
將屬性頁
在 [方案總管] 中,以滑鼠右鍵按一下多邊形。
在捷徑功能表中按一下 [加入],然後按一下 [加入類別]。
從範本、選取的 [ATL 屬性頁] 並按一下 [新增] 清單。
在 ATL 屬性頁精靈出現時,請輸入 PolyProp 做為 [簡短] 名稱。
按一下 [字串] 開啟 [字串] 網頁和輸入 [_&Polygon] 做為 [標題]。
屬性頁的 [標題] 是出現在該頁面上的 索引標籤的字串。[文件字串] 是屬性架構在狀態列或工具提示使用將的描述。請注意標準屬性框目前並未使用這個字串,因此,您可以將其保留預設內容。當您時不會產生 [說明檔] ,所以,請刪除該文字方塊中輸入。
按一下 , [完成],而且屬性頁將建立物件。
下列三個檔案建立:
檔案 |
描述 |
---|---|
PolyProp.h |
包含 C++ 類別 CPolyProp,實作屬性頁。 |
PolyProp.cpp |
包含 PolyProp.h 檔案。 |
PolyProp.rgs |
將屬性註冊頁面物件的註冊指令碼。 |
下列程式碼變更也會進行:
新的屬性頁加入至物件的 Polygon.cpp 輸入對應。
PolyProp 類別加入至 Polygon.idl 檔案。
新的註冊指令碼檔 PolyProp.rgs 加入至專案資源。
對話方塊範本加入至屬性頁的專案資源。
您指定的屬性加入字串資源字串資料表。
現在加入欄位要出現在 屬性頁。
將欄位加入至屬性頁
在 [方案總管] 中,按兩下 Polygon.rc 資源檔。這樣會開啟 [資源檢視]。
在 [資源檢視] 中,展開 對話方塊節點並且按兩下 IDD_POLYPROP。請注意出現的對話方塊空白 (除了告訴您插入您的控制項在這裡的標籤。
選取該標籤並將藉由修改 [屬性] 視窗的 [字幕] 讀取文字 框: 。
調整方塊標籤,以便調整文字的大小。
在標籤右邊從工具箱拖曳該編輯控制項。
最後,使用 [屬性] 視窗中,變更編輯控制項的 [ID] 至 IDC_SIDES 。
此完成建立屬性頁資源的處理序 (Process)。
加入程式碼以建立和管理屬性頁
現在您已經建立屬性頁資源,您必須撰寫實作程式碼。
首先, [套用] ,當按下按鈕,請將 CPolyProp 類別設定邊數在物件上。
若要修改套用請函式設定邊數
使用下列程式碼取代 PolyProp.h 的 Apply 函式:
STDMETHOD(Apply)(void) { USES_CONVERSION; ATLTRACE(_T("CPolyProp::Apply\n")); for (UINT i = 0; i < m_nObjects; i++) { CComQIPtr<IPolyCtl, &IID_IPolyCtl> pPoly(m_ppUnk[i]); short nSides = (short)GetDlgItemInt(IDC_SIDES); if FAILED(pPoly->put_Sides(nSides)) { CComPtr<IErrorInfo> pError; CComBSTR strError; GetErrorInfo(0, &pError); pError->GetDescription(&strError); MessageBox(OLE2T(strError), _T("Error"), MB_ICONEXCLAMATION); return E_FAIL; } } m_bDirty = FALSE; return S_OK; }
屬性頁可以擁有多個用戶端一次就會附加至其中,因此, Apply 函式迴圈並呼叫每個用戶端的 put_Sides 具有從編輯方塊要擷取的值。您可以使用 CComQIPtr 類別,則在每個物件的 QueryInterface 從 IUnknown 介面的 IPolyCtl 介面 (儲存在 m_ppUnk 陣列)。
程式碼會檢查設定 Sides 屬性實際運作。如果失敗,則程式碼會顯示從 IErrorInfo 介面的訊息方塊錯誤詳細資料。通常,容器要求物件 ISupportErrorInfo 介面則先呼叫 InterfaceSupportsErrorInfo ,判斷物件是否支援將錯誤資訊。您可以略過這項工作。
CComPtr 透過自動處理計數的參考來協助您,因此,您不需要呼叫介面中的 Release 。CComBSTR 協助您 BSTR 的處理,因此,您不需要執行最後的 SysFreeString 呼叫。您也可以使用其中一個各種字串轉換為類別,因此,如果需要,您也可以轉換 BSTR (這就是為什麼 USES_CONVERSION 巨集是在函式的開頭)。
您也需要設定 屬性頁的記錄變更旗標表示應該啟用 [套用] 按鈕。當使用者變更 [邊界] 編輯方塊中的值,就會發生這種情形。
處理套用按鈕
在 [類別檢視] 中,以滑鼠右鍵按一下 CPolyProp 並按一下 [屬性] 在捷徑功能表上的 。
在 [屬性] 視窗中,按一下 [事件] 圖示。
展開 [事件清單的 IDC_SIDES 節點。
選取的 EN_CHANGE,然後從下拉式功能表右邊,按一下 [<Add> OnEnChangeSides]。OnEnChangeSides 處理常式宣告加入至 Polyprop.h 和處理常式實作 Polyprop.cpp。
接下來,您將會修改這個處理常式。
修改 OnEnChangeSides 方法
將 Polyprop.cpp 的下列程式碼加入至 OnEnChangeSides 方法 (刪除任何程式碼精靈將其中):
LRESULT CPolyProp::OnEnChangeSides(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/) { SetDirty(TRUE); return 0; }
當 WM_COMMAND 資訊傳送 IDC_SIDES 控制項, EN_CHANGE 告知OnEnChangeSides 會呼叫。OnEnChangeSides 然後呼叫 SetDirty ,而且成功指示屬性頁的 TRUE 現在已經變更,而且應該啟用 [套用] 按鈕。
將屬性頁加入至控制項
ATL 加入類別精靈,而 ATL 屬性頁精靈不會自動將屬性頁加入至您的控制項,,因為可能會在專案的多個控制項。您必須將項目加入至控制項的屬性。
將屬性頁
開啟 PolyCtl.h 並將這一行加入屬性對應:
PROP_ENTRY_TYPE("Sides", 1, CLSID_PolyProp, VT_INT)
控制項的屬性對應現在看起來就像這樣:
BEGIN_PROP_MAP(CPolyCtl)
PROP_DATA_ENTRY("_cx", m_sizeExtent.cx, VT_UI4)
PROP_DATA_ENTRY("_cy", m_sizeExtent.cy, VT_UI4)
#ifndef _WIN32_WCE
PROP_ENTRY_TYPE("FillColor", DISPID_FILLCOLOR, CLSID_StockColorPage, VT_UI4)
#endif
PROP_ENTRY_TYPE("Sides", 1, CLSID_PolyProp, VT_INT)
// Example entries
// PROP_ENTRY("Property Description", dispid, clsid)
// PROP_PAGE(CLSID_StockColorPage)
END_PROP_MAP()
您可以加入了哪些屬性頁 CLSID 的 PROP_PAGE 巨集,,不過,如果您使用 PROP_ENTRY 巨集如下所示, Sides 屬性值也會儲存,當控制項儲存時。
使用巨集的三個參數是屬性描述、屬性的 DISPID 和有屬性屬性頁的 CLSID。這個方法很有用,例如,,如果您將控制項載入到 Visual Basic 並設定邊數在設計階段。由於邊數儲存,,當您重新載入您的 Visual Basic 專案,邊數將會還原。
建置和測試控制項
現在請建立該控制項並將其插入 ActiveX 控制項測試容器。在測試容器,請在功能表上,按一下 [編輯][PolyCtl 類別物件]。屬性頁隨即出現,按一下 [多邊形] 索引標籤。
[套用] 按鈕一開始會停用。開始輸入在 [邊界] 方塊中的值,並 [套用] 按鈕將會變成可用狀態。在您完成輸入值之後,請按一下 [套用] 按鈕。控制項顯示變更和 [套用] 按鈕已停用。輸入無效值的嘗試。您會看到訊息方塊包含錯誤描述您從 put_Sides 函式的集合。
接下來,您將在 Web 網頁中將您的控制項。