ActiveX 在網際網路上的控制項
ActiveX 控制項是 OLE 控制規格的更新的版本。控制項是主要的架構來開發可用於各種不同的容器,包括在網際網路上的 COM 感知的網頁瀏覽器中的可程式化的軟體元件。ActiveX 的任何控制項時會網際網路控制,可以將它的功能加入至主動式文件或成為 Web 網頁的一部分。在網頁上的控制項可以使用指令執行相互通訊。
ActiveX 控制項並不僅限於網際網路。ActiveX 控制項也可用在任何容器中,只要控制項支援該容器所需的介面。
ActiveX 控制項有幾項優點,包括:
更少比早期的 OLE 控制項必要的介面。
能以無視窗,並永遠就地啟動。
為了要讓 ActiveX 控制項,控制項必須:
支援 IUnknown 介面。
是 COM 物件。
匯出 DLLRegisterServer 和 DLLUnRegisterServer。
所需的功能,支援額外的介面。
網際網路友善製作您現有的控制項
設計一種控制項,將在 Internet 環境中正常運作需要相對較低的傳輸速率,在網際網路上的考量因素。您可以使用現有的控制項。 不過,會使您的程式碼大小變小,且隨時讓您以非同步方式下載的控制項屬性,您應該採取的步驟。
若要改善控制項的效能,請遵循這些效率考量的提示:
實作本文所述的技巧 ActiveX 控制項: 最佳化。
請考慮控制項執行個體化的方式。
是非同步化 ; 不要把其他程式。
立即下載以小區塊。
下載諸如點陣圖或視訊資料的大量資料流,來存取控制項的資料與容器一起非同步地。擷取資料以遞增或漸進的方式,與其他可能擷取資料的控制項的容器一起處理。也可以非同步地下載程式碼。
下載程式碼,並在背景中的屬性。
使用者介面會變得最快的方式為使用中。
請考慮屬性和大型資料如何儲存永續性資料,Blob (諸如點陣圖影像或視訊資料)。
具有大量永續性資料,例如大型點陣圖或 AVI 檔等的控制項就需要格外注意下載的方法。文件或網頁都可以包括 [越快越好,就可以看見,並允許使用者與網頁互動,而控制項擷取資料,在背景中。
撰寫高效率的常式,以保留程式碼的大小,並向下執行的時間。
小按鈕和標籤控制項,只有幾個位元組永續性資料與是適用於網際網路環境,也可以在瀏覽器內的工作。
請考慮在傳遞給容器的進度。
告知容器非同步下載,包括使用者可以開始與網頁互動,並完成下載後進行。容器可顯示進度 (例如完成比例) 給使用者。
請考慮如何將控制項註冊用戶端電腦上。
建立一個新的 ActiveX 控制項
在建立新的控制項使用應用程式精靈,您可以選擇啟用非同步 moniker,以及其他的最佳化處理的支援。若要加入以非同步方式下載控制項屬性的支援,請依照下列步驟執行:
若要使用 MFC ActiveX 控制項精靈建立專案
按一下 [ New上檔案功能表。
選取 [ MFC ActiveX 控制項精靈從 Visual C++ 專案,並命名為您的專案。
在控制設定 ] 頁面上,選取 非同步載入屬性。選取此選項讓您設定就緒狀態屬性和就緒狀態變更事件。
也可以選取其他的最佳化處理,例如無視窗啟動,其說明已在 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,會傳遞一個顯示的最大範圍的數字,而數字的顯示,以及目前的下載是。若要向使用者顯示如完成百分比的狀態,您可以使用這些數字。
下一個程序會將屬性加入控制項使用剛才所衍生的類別。
若要將屬性加入
在類別檢視,以滑鼠右鍵按一下程式庫節點下方的介面,然後選取 新增,然後 加入屬性。如此便會開啟加入屬性精靈。
在加入屬性精靈,請選取 Set/Get 方法 選項按鈕、 限制式類型 屬性名稱、 範例、 EditControlText,以及做為 select BSTR 屬性型別。
按一下 [完成]。
將變數宣告為成員您CDataPathProperty-ActiveX 控制項類別衍生的類別。
CMyDataPathProperty EditControlText;
實作 Get/Set 方法。對於取得,傳回的字串。對於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 提供透過網路以非同步方式下載資料的方式。會在非同步的 moniker 的讀取作業立即傳回,即使作業尚未完成。
比方說,如果只有 10 個位元組可使用,而且讀取便會非同步呼叫上 1k 的檔案,讀取不會封鎖,而是傳回目前可用的 10 個位元組。
您實作非同步 moniker 使用CAsyncMonikerFile類別。不過,可以使用 ActiveX 控制項CDataPathProperty類別衍生自CAsyncMonikerFile,以協助實作非同步的控制項屬性。
ASYNDOWN 範例會示範如何設定一個非同步讀取資料使用計時器的迴圈。ASYNDOWN 中有 「 如何:: AsyncDown 示範非同步資料下載 」 (Q177244) 的知識庫文件中詳細說明,而是可以從 「 Microsoft 下載中心 」 下載。(如需有關如何從 「 Microsoft 下載中心 」 下載檔案的詳細資訊,請參閱文章 「 如何來取得 Microsoft 支援檔案從線上服務 」 (Q119591) 「 Microsoft 知識庫 」 中的文)。您可以在 MSDN Library CD-ROM 或是在 https://support.microsoft.com/default.aspx?ln=zh-tw 中找到知識庫文件。
在 ASYNDOWN 中所使用的基本技巧是設定計時器 CDataPathProperty::OnDataAvailable ,表示當資料可供使用。收到該計時器訊息時,應用程式會讀取以 128 位元區塊的資料,並填入編輯控制項。如果資料無法使用處理計時器訊息時,則會關閉計時器。OnDataAvailable如果更多資料抵達稍後,啟動計時器。
顯示 Web 網頁上控制項
以下是範例的 object 標記,並插入至網頁上的控制項的屬性。
<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 控制項建立 Visual C++ 4.2 以前的版本中,有會增進效能並增強其功能時可採取的步驟。這些變更的詳細探討,請參閱 ActiveX 控制項: 最佳化。
如果您要加入現有的控制項非同步屬性的支援,您必須新增就緒狀態屬性和ReadyStateChange事件自己。在您的控制項的建構函式,加入:
m_lReadyState = READYSTATE_LOADING;
藉由呼叫程式碼會下載完畢後,就會更新的備妥狀態 COleControl::InternalSetReadyState。同一個地方,您可以把InternalSetReadyState是從OnProgress的覆寫CDataPathProperty-衍生的類別。
然後,遵循的步驟,在建立一個新的 ActiveX 控制項。