MFC を使ってビデオ コントロールをホストする方法
このトピックは Windows XP にのみ適用。
注 この内容は Microsoft® Visual C++® バージョン 6.0 で MFC バージョン 6.0 を使う場合に適用される。
ここでは、ビデオ コントロールをホストする MFC アプリケーションの作成方法について説明する。プロジェクトを設定するには、以下の手順を実行する。
MFC App Wizard を使って新しいプロジェクトを作成する。ドキュメント表示アーキテクチャを持たないダイアログ ベースのアプリケーションがおそらく最も簡単だが、そうするかどうかはユーザー次第である。Active X コントロールと Automation サポートに関するチェック ボックスをオンにする。
strmiids.lib にリンクする。
次のようにビデオ コントロールとその関連インターフェイスのラッパー クラスを追加する。
- [プロジェクト] メニューから [プロジェクトへ追加]、[コンポーネントおよびコントロール] を選択する。
- [Registered ActiveX Controls] フォルダを開く。
- [MS TV Video Control] を選択し、[挿入] をクリックする。
- Class Wizard に作成対象として表示されるすべてのラッパー クラスを作成する。CMSVidCtl クラスについては、同じ名前の DirectShow インクルード ファイルとの混乱を避けるために、デフォルトのファイル名を msvidctl.* から msvidctl_1.* などに変更するとよい。
リソース ビューで、ダイアログまたはウィンドウ フォームを開く。[コントロール] ツールバーからアイコンをドラッグしてビデオ コントロールをフォームに追加する。
次のようにコントロールのデータ メンバを追加する。
- コントロールを右クリックして [Class Wizard] を選択する。
- [メンバ変数] タブを選択して [変数の追加] をクリックする。
- データ メンバの変数名を入力する。
以下のヘッダー ファイルをインクルードする。
tuner.h
msvidctl.h
Tuner.h はチューニング モデル インターフェイスを定義し、msvidctl.h はビデオ コントロール インターフェイスを定義する。MFC では、使う必要がある特定の派生クラスのラッパー クラスが提供されないため、msvidctl.h をインクルードする必要がある。
ビデオ コントロール用の DLL である msvidctl.dll は 2 種類のライブラリを含んでいるが、MFC は両ライブラリにあるすべてのオブジェクトに対してラッパー クラスを作成するわけではない。したがって、さまざまなビデオ コントロール オブジェクトとチューニング モデル オブジェクトへのアクセスおよびコントロールでは複数の手法を組み合わせて使う必要がある。次のコード例はそれらの手法を示している。
MFC が生成したラッパー クラスのインスタンスを作成する。
すべての COM 呼び出しは非表示である。ラッパー クラス内のメソッド名と、MIDL によって生成された元のヘッダー ファイル内の名前がわずかに異なる点に注意すること。
CMSVidVideoRenderer myRenderer = m_VidCtl.GetActiveRenderer();
CRect sourceRect = myRenderer.GetSourceSize();
チューニング モデル COM オブジェクトのインスタンスを作成する。
MFC ではチューニング モデル オブジェクト用のラッパー クラスが作成されないため、CoCreateInstance や QueryInterface などのネイティブ COM メソッドを使って作成およびアクセスする必要がある。
HRESULT hr;
CComPtr<ITuningSpaceContainer> pTuningSpaceContainer;
hr = CoCreateInstance(CLSID_SystemTuningSpaces,
NULL,
CLSCTX_INPROC_SERVER,
IID_ITuningSpaceContainer,
reinterpret_cast<void**> (&pTuningSpaceContainer));
if(FAILED(hr))
{
AfxMessageBox("Failed to create system tuning spaces object");
return false;
}
long count = 0;
hr = pTuningSpaceContainer->get_Count(&count);
if(FAILED(hr))
{
AfxMessageBox("Failed to get count");
return false;
}
ラッパー クラスから派生インターフェイスを取得する。
MFC は IMSVidTuner など一部の派生インターフェイス用のラッパー クラスを作成しない。これらのインターフェイスへのポインタを取得し、ラッパー クラスの m_lpDispatch メンバ (IDispatch ポインタ) を使い、QueryInterface を呼び出す。
CMSVidInputDevice inputDevice = m_VidCtl.GetInputActive();
if (inputDevice.m_lpDispatch)
{
// アクティブな入力がある。
CComPtr<IMSVidTuner> myTuner;
inputDevice.m_lpDispatch->QueryInterface(
__uuidof(IMSVidTuner),
reinterpret_cast<void**> &myTuner);
if (FAILED(hr))
{
AfxMessageBox("Failed to QI for tuner");
return;
}
// pATSCTR が IATSCTuneRequest インターフェイス ポインタであると仮定する。
myTuner->put_Tune(pATSCTR);
}