ActiveX 在網際網路上的控制項

ActiveX 控制項是 OLE 控制規格的更新的版本。控制項是主要的架構來開發可用於各種不同的容器,包括在網際網路上的 COM 感知的網頁瀏覽器中的可程式化的軟體元件。ActiveX 的任何控制項時會網際網路控制,可以將它的功能加入至主動式文件或成為 Web 網頁的一部分。在網頁上的控制項可以使用指令執行相互通訊。

ActiveX 控制項並不僅限於網際網路。ActiveX 控制項也可用在任何容器中,只要控制項支援該容器所需的介面。

ActiveX 控制項有幾項優點,包括:

  • 更少比早期的 OLE 控制項必要的介面。

  • 能以無視窗,並永遠就地啟動。

為了要讓 ActiveX 控制項,控制項必須:

  • 支援 IUnknown 介面。

  • 是 COM 物件。

  • 匯出 DLLRegisterServerDLLUnRegisterServer

  • 所需的功能,支援額外的介面。

網際網路友善製作您現有的控制項

設計一種控制項,將在 Internet 環境中正常運作需要相對較低的傳輸速率,在網際網路上的考量因素。您可以使用現有的控制項。 不過,會使您的程式碼大小變小,且隨時讓您以非同步方式下載的控制項屬性,您應該採取的步驟。

若要改善控制項的效能,請遵循這些效率考量的提示:

  • 實作本文所述的技巧 ActiveX 控制項: 最佳化

  • 請考慮控制項執行個體化的方式。

  • 是非同步化 ; 不要把其他程式。

  • 立即下載以小區塊。

    下載諸如點陣圖或視訊資料的大量資料流,來存取控制項的資料與容器一起非同步地。擷取資料以遞增或漸進的方式,與其他可能擷取資料的控制項的容器一起處理。也可以非同步地下載程式碼。

  • 下載程式碼,並在背景中的屬性。

  • 使用者介面會變得最快的方式為使用中。

  • 請考慮屬性和大型資料如何儲存永續性資料,Blob (諸如點陣圖影像或視訊資料)。

    具有大量永續性資料,例如大型點陣圖或 AVI 檔等的控制項就需要格外注意下載的方法。文件或網頁都可以包括 [越快越好,就可以看見,並允許使用者與網頁互動,而控制項擷取資料,在背景中。

  • 撰寫高效率的常式,以保留程式碼的大小,並向下執行的時間。

    小按鈕和標籤控制項,只有幾個位元組永續性資料與是適用於網際網路環境,也可以在瀏覽器內的工作。

  • 請考慮在傳遞給容器的進度。

    告知容器非同步下載,包括使用者可以開始與網頁互動,並完成下載後進行。容器可顯示進度 (例如完成比例) 給使用者。

  • 請考慮如何將控制項註冊用戶端電腦上。

建立一個新的 ActiveX 控制項

在建立新的控制項使用應用程式精靈,您可以選擇啟用非同步 moniker,以及其他的最佳化處理的支援。若要加入以非同步方式下載控制項屬性的支援,請依照下列步驟執行:

若要使用 MFC ActiveX 控制項精靈建立專案

  1. 按一下 [ New上檔案功能表。

  2. 選取 [ MFC ActiveX 控制項精靈從 Visual C++ 專案,並命名為您的專案。

  3. 控制設定 ] 頁面上,選取 非同步載入屬性。選取此選項讓您設定就緒狀態屬性和就緒狀態變更事件。

    也可以選取其他的最佳化處理,例如無視窗啟動,其說明已在 ActiveX 控制項: 最佳化

  4. 選擇完成來建立專案。

若要建立衍生自 CDataPathProperty

  1. 建立衍生自CDataPathProperty

  2. 在每一個包含您的控制項的標頭檔的原始程式檔中,加入這個類別,它前面的標頭檔。

  3. 在此類別中覆寫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類別。

  4. 當您的控制項的整體狀態變更 (例如,從載入至初始化或使用者互動),呼叫COleControl::InternalSetReadyState。如果您的控制項只能有一個資料路徑] 屬性,您可以加入程式碼在 BSCF_LASTDATANOTIFICATION 來通知容器下載已完成。例如:

    if (bscfFlag & BSCF_LASTDATANOTIFICATION)
    {
       GetControl()->InternalSetReadyState(READYSTATE_COMPLETE);
    }
    
  5. 覆寫 OnProgress。在OnProgress,會傳遞一個顯示的最大範圍的數字,而數字的顯示,以及目前的下載是。若要向使用者顯示如完成百分比的狀態,您可以使用這些數字。

下一個程序會將屬性加入控制項使用剛才所衍生的類別。

若要將屬性加入

  1. 類別檢視,以滑鼠右鍵按一下程式庫節點下方的介面,然後選取 新增,然後 加入屬性。如此便會開啟加入屬性精靈

  2. 加入屬性精靈,請選取 Set/Get 方法 選項按鈕、 限制式類型 屬性名稱、 範例、 EditControlText,以及做為 select BSTR 屬性型別

  3. 按一下 [完成]。

  4. 將變數宣告為成員您CDataPathProperty-ActiveX 控制項類別衍生的類別。

    CMyDataPathProperty EditControlText;
    
  5. 實作 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();
    }
    
  6. DoPropExchange,新增下面這一行:

    PX_DataPath(pPX, _T("DataPath"), EditControlText);
    
  7. 覆寫 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 控制項。

請參閱

概念

MFC 網際網路程式設計工作

MFC 網際網路程式設計基本概念