次の方法で共有


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

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

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

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

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

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

ATL COM AppWizard を使って新しいプロジェクトを作成する。サーバー タイプとして [Executable (EXE)] を選択する。ヘッダー ファイル Msvidctl.h をインクルードし、Strmiids.lib ライブラリにリンクする。

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

ATL Object Wizard を使って複合コントロールを作成する。この例では、デフォルトの属性をそのまま使用してかまわない。コントロールに名前を付ける (たとえば MyComposite)。

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

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

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

さらに、ダイアログ プロパティの [表示] をオンにする。そうしないと、コントロールは表示されない。

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

ATL Object Wizard によって汎用 WinMain 関数が作成される。この関数の内側の、複合コントロールを作成して表示するメッセージ ループの前にコードを追加する。次のコード例では、追加する必要があるコードを太字で示している。

extern "C" int WINAPI _tWinMain(HINSTANCE hInstance, 
    HINSTANCE /*hPrevInstance*/, LPTSTR lpCmdLine, int /*nShowCmd*/)
{
    /* ... */

        //ウィンドウを作成して複合コントロールを表示する。
    AtlAxWinInit();
    HWND hWnd = ::CreateWindow(TEXT("AtlAxWin"), 
        Text("Your Control's ProgID Here"), 
        // 例:  TEXT("MyTVApp.MyComposite")
        NULL,
        CW_USEDEFAULT, CW_USEDEFAULT,
        CW_USEDEFAULT, CW_USEDEFAULT,
        NULL, NULL,
        ::GetModuleHandle(NULL), NULL);

    MSG msg;
    while (GetMessage(&msg, 0, 0, 0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    /* ... */
}

また、WM_CLOSE メッセージのメッセージ ハンドラを追加する。その中で、ウィンドウを破棄して終了メッセージを送信する。

LRESULT MyComposite::OnClose(
    UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
{
    DestroyWindow();
    PostQuitMessage(0);
    return 0;
}

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

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