ActiveX コントロールは、OLE コントロール仕様の更新バージョンです。
Von Bedeutung
ActiveX は、新しい開発には使用すべきではないレガシ テクノロジです。 詳細については、「ActiveX コントロール」を参照してください。
コントロールは、インターネット上の COM 対応 Web ブラウザーなど、さまざまなコンテナーで使用できるプログラミング可能なソフトウェア コンポーネントを開発するための主要なアーキテクチャです。 任意の ActiveX コントロールをインターネット コントロールにすることができ、その機能を Active ドキュメントに追加したり、Web ページの一部にしたりできます。 Web ページ上のコントロールは、スクリプトを使用して相互に通信できます。
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 を含める必要があることに注意してください。
CListCtrl
クラスを使用する場合は H。コントロールの全体的な状態が変更された場合 (読み込みから初期化またはユーザー対話型など)、
COleControl::InternalSetReadyState
を呼び出します。 コントロールにデータ パス プロパティが 1 つしかない場合は、 BSCF_LASTDATANOTIFICATION にコードを追加して、ダウンロードが完了したことをコンテナーに通知できます。 例えば次が挙げられます。if (bscfFlag & BSCF_LASTDATANOTIFICATION) { GetControl()->InternalSetReadyState(READYSTATE_COMPLETE); }
OnProgress
をオーバーライドします。OnProgress
では、最大範囲を示す数値と、現在のダウンロードに沿った距離を示す数値が渡されます。 これらの数値を使用して、ユーザーに対する達成率などの状態を表示できます。
次のプロシージャでは、派生したクラスを使用するプロパティをコントロールに追加します。
プロパティを追加するには
クラス ビューで、ライブラリ ノードの下にあるインターフェイスを右クリックし、[追加]、[プロパティの追加] の順に選択します。 これにより、プロパティの 追加ウィザードが起動します。
プロパティの 追加ウィザードで、[メソッドの 設定/取得] ラジオ ボタンを選択し、 プロパティ名 (EditControlText など) を入力し、 プロパティの種類として BSTR を選択します。
[完了] をクリックします。
CDataPathProperty
派生クラスのメンバー変数を ActiveX コントロール クラスに宣言します。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 コントロールを使用して非同期的にデータをダウンロードする
ネットワーク経由でのデータのダウンロードは非同期的に行う必要があります。 その利点は、大量のデータが転送された場合、または接続が遅い場合、ダウンロード プロセスがクライアント上の他のプロセスをブロックしないことです。
非同期モニカーは、ネットワーク経由で非同期的にデータをダウンロードする方法を提供します。 非同期モニカーに対する読み取り操作は、操作が完了していない場合でもすぐに返されます。
たとえば、10 バイトしか使用できない場合、Read は 1K ファイルで非同期的に呼び出されますが、Read はブロックしませんが、現在使用可能な 10 バイトを返します。
CAsyncMonikerFile
クラスを使用して非同期モニカーを実装します。 ただし、ActiveX コントロールでは、CAsyncMonikerFile
から派生した CDataPathProperty
クラスを使用して、非同期コントロールのプロパティを実装できます。
Web ページにコントロールを表示する
Web ページにコントロールを挿入するためのオブジェクト タグと属性の例を次に示します。
<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>
新しい ActiveX コントロール機能を使用するように既存の OLE コントロールを更新する
OLE コントロールが 4.2 より前のバージョンの Visual C++ で作成されている場合は、パフォーマンスを向上させ、その機能を強化するために実行できる手順があります。 これらの変更の詳細については、「 ActiveX コントロール: 最適化」を参照してください。
既存のコントロールに非同期プロパティのサポートを追加する場合は、準備完了状態プロパティと ReadyStateChange
イベントを自分で追加する必要があります。 コントロールのコンストラクターに、次を追加します。
m_lReadyState = READYSTATE_LOADING;
COleControl::InternalSetReadyState を呼び出して、コードのダウンロード時に準備完了状態を更新します。
InternalSetReadyState
呼び出すことができる場所の 1 つは、CDataPathProperty
派生クラスのOnProgress
オーバーライドからの場所です。