次の方法で共有


MFC を使ってビデオ コントロールをホストする方法

このトピックは Windows XP にのみ適用。

この内容は Microsoft® Visual C++® バージョン 6.0 で MFC バージョン 6.0 を使う場合に適用される。

ここでは、ビデオ コントロールをホストする MFC アプリケーションの作成方法について説明する。プロジェクトを設定するには、以下の手順を実行する。

  1. MFC App Wizard を使って新しいプロジェクトを作成する。ドキュメント表示アーキテクチャを持たないダイアログ ベースのアプリケーションがおそらく最も簡単だが、そうするかどうかはユーザー次第である。Active X コントロールと Automation サポートに関するチェック ボックスをオンにする。

  2. strmiids.lib にリンクする。

  3. 次のようにビデオ コントロールとその関連インターフェイスのラッパー クラスを追加する。

    1. [プロジェクト] メニューから [プロジェクトへ追加]、[コンポーネントおよびコントロール] を選択する。
    2. [Registered ActiveX Controls] フォルダを開く。
    3. [MS TV Video Control] を選択し、[挿入] をクリックする。
    4. Class Wizard に作成対象として表示されるすべてのラッパー クラスを作成する。CMSVidCtl クラスについては、同じ名前の DirectShow インクルード ファイルとの混乱を避けるために、デフォルトのファイル名を msvidctl.* から msvidctl_1.* などに変更するとよい。
  4. リソース ビューで、ダイアログまたはウィンドウ フォームを開く。[コントロール] ツールバーからアイコンをドラッグしてビデオ コントロールをフォームに追加する。

  5. 次のようにコントロールのデータ メンバを追加する。

    1. コントロールを右クリックして [Class Wizard] を選択する。
    2. [メンバ変数] タブを選択して [変数の追加] をクリックする。
    3. データ メンバの変数名を入力する。
  6. 以下のヘッダー ファイルをインクルードする。

    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 ではチューニング モデル オブジェクト用のラッパー クラスが作成されないため、CoCreateInstanceQueryInterface などのネイティブ 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);
}