次の方法で共有


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

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

ここでは、ATL 7.0 と Visual Studio.NET を使ってビデオ コントロールをホストする方法について説明する。アプリケーションは複合コントロールの内部にビデオ コントロールをホストする。複合コントロールは ActiveX オブジェクトの 1 つのタイプであり、他のコントロールを包含する。アプリケーションを作成するには、以下の手順を実行する必要がある。

  • ATL AppWizard でフレームワークを作成する。
  • ATL CComCompositeControl クラスを使って複合コントロールを追加する。
  • ビデオ コントロールを複合コントロールに追加する。
  • 複合コントロールを表示するためのコードを追加する。

これらの手順について以下に詳しく説明する。

フレームワークを作成する

新しいプロジェクトを作成し、プロジェクト タイプから [ATL プロジェクト] を選択する。アプリケーションの設定で、[実行可能なアプリケーション (EXE)] を選択する。

ヘッダー ファイル Msvidctl.h をインクルードし、Strmiids.lib ライブラリにリンクする。

複合コントロールを追加する

複合コントロール クラスをプロジェクトに追加する。

  1. [プロジェクト] メニューの [クラスの追加] を選択する。
  2. [ATL コントロール] を選択し、[開く] をクリックする。
  3. コントロールに名前を付ける (MyControl など)。
  4. [オプション] の [複合コントロール] を選択する。この例では、残りのオプションにはデフォルト値をそのまま使用してもかまわない。

ビデオ コントロールを追加する

次のように、Dialog Editor を使ってビデオ コントロールを複合コントロールに追加する。

  1. ダイアログ ボックスを右クリックする。
  2. [ActiveX コントロールの挿入] を選択する。
  3. [MS TV Video Control] を選択する。Msvidctl.dll がシステムに登録されている場合は、選択したコントロールがリストに表示される。

また、Visible プロパティを True に設定する。そうしないと、コントロールは表示されない。

複合コントロールを表示する

CAtlExeModuleT から派生したモジュール クラスで、コントロール ウィンドウを表示するように PreMessageLoop メソッドをオーバーライドする。

class CMyControlModule : public CAtlExeModuleT< CMyControlModule >
{
public :
    HRESULT PreMessageLoop(int nCmdShow)
    {
        HRESULT hr;
        hr = CAtlExeModuleT< CMyControlModule >::PreMessageLoop(nCmdShow);
        if (FAILED(hr))
        {
            return hr;
        }
    
                //ウィンドウを作成して複合コントロールを表示する。
        AtlAxWinInit();
        HWND hWnd = ::CreateWindow(TEXT("AtlAxWin7"), 
            TEXT("Your Control's ProgID Here"), 
                    // 例:  TEXT("MyTVApp.MyComposite")
            WS_OVERLAPPED | WS_SYSMENU | WS_CAPTION,
            CW_USEDEFAULT, CW_USEDEFAULT,
            CW_USEDEFAULT, CW_USEDEFAULT,
            NULL, NULL,
            ::GetModuleHandle(NULL), NULL);
        if (hWnd == 0)
        {
            ::MessageBox(0, TEXT("Cannot create window"), 0, MB_OK);
            return E_FAIL;
        }
        ShowWindow(hWnd, nCmdShow);
        return S_OK;
    }
};

これで、次のようにコントロール クラス内からビデオ コントロールへのポインタを取得することができる。

CComPtr<IMSVidCtl> pVidControl;
hr = GetDlgControl(IDC_MSVIDCTL1, __uuidof(IMSVidCtl), 
        reinterpret_cast<void **>(&pVidControl));