ActiveX 控制件是 OLE 控制項規格的更新版本。
這很重要
ActiveX 是不應該用於新開發的舊版技術。 如需詳細資訊,請參閱 ActiveX 控制件。
控件是開發可程式化軟體元件的主要架構,可用於各種不同的容器,包括因特網上的 COM 感知網頁瀏覽器。 任何 ActiveX 控制項都可以是網際網路控制項,並可將其功能新增至活動文件或網頁的一部分。 網頁上的控制件可以使用腳本彼此通訊。
ActiveX 控件不限於因特網。 只要控件支援該容器所需的介面,ActiveX 控件也可以用於任何容器中。
ActiveX 控制件有數個優點,包括:
所需的介面比先前的 OLE 控件少。
無視窗介面且始終保持啟動狀態的能力。
若要成為ActiveX控件,控制項必須:
支援
IUnknown
介面。成為 COM 元件。
導出 DLLRegisterServer 和 DLLUnRegisterServer。
根據功能需求,支援其他介面。
使您的現有控制項 Internet-Friendly
設計在因特網環境中運作良好的控制項需要考慮因特網上相對較低的傳輸速率。 您可以使用現有的控件;不過,您應該採取一點步驟,讓您的程式代碼大小更小,並讓控件屬性以異步方式下載。
若要改善控件的效能,請遵循下列有關效率考慮的秘訣:
實作 ActiveX 控件:優化一文中所述的技術。
請考慮如何具現化控件。
保持非同步;不要阻塞其他程式。
在小型區塊中下載數據。
下載大型數據流,例如點陣圖或視訊數據時,請與容器合作,以異步方式存取控件的數據。 以累加或漸進方式擷取數據,與其他可能也會擷取數據的控件合作運作。 程序代碼也可以異步下載。
在背景下載程式代碼和屬性。
儘快啟用使用者介面。
請考慮如何儲存持續性數據,包括屬性和大型數據 BLOB(例如點陣圖影像或視訊數據)。
具有大量持續性數據的控件,例如大型位圖或 AVI 檔案,需要仔細注意下載方法。 文件或頁面可以儘快顯示,並允許使用者在控件擷取背景中的數據時與頁面互動。
撰寫有效率的程序來減少程式碼大小並縮短運行時間。
小型按鈕和標籤控件,只有幾個位元組的持久性數據,適合用於網際網路環境,且可在瀏覽器中正常運作。
請考慮將進度傳達給容器。
通知容器異步下載中的進度,包括使用者何時可以開始與頁面互動,以及下載完成的時間。 容器可以向使用者顯示進度(例如完成百分比)。
請考慮如何在用戶端計算機上註冊控制件。
建立新的 ActiveX 控制件
使用應用程式精靈建立新的控制件時,您可以選擇啟用異步名符以及其他優化功能的支援。 若要新增支援以異步方式下載控件屬性,請遵循下列步驟:
使用 MFC ActiveX 控制件精靈建立專案
單擊 [檔案] 功能表上的 [新增]。
從 Visual Studio C++ 項目中選取 [MFC ActiveX 控件精靈 ],並將專案命名。
在 [ 控件設定] 頁面上,選取 [ 異步載入屬性]。 選取此選項會為您設定就緒狀態屬性和就緒狀態變更事件。
您也可以選取其他優化,例如 無窗口啟用,如 ActiveX 控件:優化中所述。
選擇 [完成] 以建立專案。
建立衍生自 CDataPathProperty 的類別
建立衍生自
CDataPathProperty
的類別。在每個包含控件頭檔的原始檔中,先新增此類別的頭檔。
在此類別中,覆寫
OnDataAvailable
。 每當數據可供顯示時,就會呼叫此函式。 當數據可供使用時,您可以以任何方式處理它,例如逐漸轉譯它。下列程式代碼摘錄是逐步在編輯控件中顯示數據的簡單範例。 請注意,使用旗標 BSCF_FIRSTDATANOTIFICATION 來清除編輯控制。
void CMyDataPathProperty::OnDataAvailable(DWORD dwSize, DWORD bscfFlag) { CListCtrl list_ctrl; CEdit *edit = list_ctrl.GetEditControl(); if ((bscfFlag & BSCF_FIRSTDATANOTIFICATION) && edit->m_hWnd) { edit->SetSel(0, -1); edit->Clear(); } if (dwSize > 0) { CString string; LPTSTR str = string.GetBuffer(dwSize); UINT nBytesRead = Read(str, dwSize); if (nBytesRead > 0) { string.ReleaseBuffer(nBytesRead); edit->SetSel(-1, -1); edit->ReplaceSel(string); } } }
請注意,您必須包含 AFXCMN.H 才能使用
CListCtrl
類別。當您控制件的整體狀態變更時(例如,從載入到初始化或使用者互動式),請呼叫
COleControl::InternalSetReadyState
。 如果您的控制項只有一個資料路徑屬性,您可以在 BSCF_LASTDATANOTIFICATION 上新增程式代碼,以通知容器下載已完成。 例如:if (bscfFlag & BSCF_LASTDATANOTIFICATION) { GetControl()->InternalSetReadyState(READYSTATE_COMPLETE); }
覆寫
OnProgress
。 在OnProgress
中,系統會傳遞一個數字,顯示最大範圍,還有一個數字,顯示目前下載的進度。 您可以使用這些數位來向用戶顯示狀態,例如完成百分比。
下一個程式會將 屬性新增至 控件,以使用剛衍生的 類別。
若要新增屬性
在 [類別檢視] 中,以滑鼠右鍵按兩下連結庫節點下方的介面,然後選取[ 新增],然後選取 [ 新增屬性]。 這會啟動 [新增屬性精靈]。
在 [ 新增屬性精靈] 中,選取 [設定/取得方法] 單選按鈕、輸入 屬性名稱,例如 EditControlText,然後選取 BSTR 作為 [屬性類型]。
按一下完成。
在 ActiveX 控件類別中宣告您的
CDataPathProperty
衍生類別的成員變數。CMyDataPathProperty EditControlText;
實作
Get/Set
方法。 針對Get
,傳回字串。 針對Set
,載入 屬性並呼叫SetModifiedFlag
。BSTR CMFCActiveXControlCtrl::GetEditControlText(void) { AFX_MANAGE_STATE(AfxGetStaticModuleState()); CString strResult; strResult = EditControlText.GetPath(); return strResult.AllocSysString(); } void CMFCActiveXControlCtrl::SetEditControlText(LPCTSTR newVal) { AFX_MANAGE_STATE(AfxGetStaticModuleState()); Load(newVal, EditControlText); SetModifiedFlag(); }
在 DoPropExchange 中,新增下列這一行:
PX_DataPath(pPX, _T("DataPath"), EditControlText);
覆寫 ResetData,藉由新增這一行來通知屬性,從而重設其控制項。
EditControlText.ResetData();
決定是否要衍生自 CDataPathProperty 或 CCachedDataPathProperty
上一個範例說明從CDataPathProperty
衍生您的控件的屬性的步驟。 如果您要下載經常變更的實時數據,而且您不需要保留所有數據,但只有目前的值,這是不錯的選擇。 例如股票代碼控件。
您也可以衍生自 CCachedDataPathProperty
。 在此情況下,下載的數據會快取在記憶體檔案中。 如果您需要保留所有下載的數據,這是一個不錯的選擇,例如,一個逐步渲染位圖的控制項。 在這裡情況下,類別具有包含您的資料的成員變數:
CMemFile m_Cache;
在 ActiveX 控制項類別中,您可以使用中的這個記憶體對應檔案 OnDraw
來顯示資料。 在您的 ActiveX 控件CCachedDataPathProperty
衍生類別中,覆寫成員函式OnDataAvailable
,並在呼叫基類實作之後將控制項設為無效。
void CMyCachedDataPathProperty::OnDataAvailable(DWORD dwSize, DWORD bscfFlag)
{
CCachedDataPathProperty::OnDataAvailable(dwSize, bscfFlag);
GetControl()->InvalidateControl();
}
使用 ActiveX 控制件以異步方式下載數據
應以異步方式透過網路下載數據。 這樣做的優點是,如果傳輸大量數據或連線速度緩慢,下載程式將不會封鎖用戶端上的其他進程。
異步 Moniker 提供一種方式,以異步方式透過網路下載數據。 異步識別項的讀取操作會立即返回,即使操作尚未完成也一樣。
例如,如果只有 10 個字節可用,而且在 1K 檔案上以異步方式呼叫 Read,則 Read 不會封鎖,但會傳回目前可用的 10 個字節。
您可以實作異步標記,方法是使用CAsyncMonikerFile
類別。 不過,ActiveX 控件可以使用衍生自 CDataPathProperty
的 CAsyncMonikerFile
類別,協助實作異步控件屬性。
在網頁上顯示控制件
以下是在網頁上插入控件的對象標記和屬性範例。
<OBJECT
CLASSID="clsid:FC25B780-75BE-11CF-8B01-444553540000"
CODEBASE="/ie/download/activex/iechart.ocx"
ID=chart1
WIDTH=400
HEIGHT=200
ALIGN=center
HSPACE=0
VSPACE=0>
<PARAM NAME="BackColor" value="#ffffff"/>
<PARAM NAME="ForeColor" value="#0000ff"/>
<PARAM NAME="url" VALUE="/ie/controls/chart/mychart.txt"/>
</OBJECT>
更新現有的 OLE 控制項以使用新的 ActiveX 控制件功能
如果您的 OLE 控制項是以 4.2 之前的 Visual C++ 版本建立,您可以採取一定步驟來改善其效能並增強其功能。 如需這些變更的詳細討論,請參閱 ActiveX 控件:優化。
如果您要將異步屬性支援新增至現有的控件,則必須自行新增就緒狀態屬性和 ReadyStateChange
事件。 在控件的建構函式中,新增:
m_lReadyState = READYSTATE_LOADING;
呼叫 COleControl::InternalSetReadyState 來下載程式代碼時,您將更新就緒狀態。 您可以從 InternalSetReadyState
覆寫的 OnProgress
衍生類別中呼叫 CDataPathProperty
的位置之一。