2013年6月15日土曜日

作成したウインドウ上で動画再生

ウインドウの作成:win32 の記事で作ったウインドウに
msdnのサンプルコードを実行してみる で作ったソースを追加

IVideoWindow インターフェイス

ウインドウ作成時に動画を再生するようにする。


// GT_HelloWorldWin32.cpp
// compile with: /D_UNICODE /DUNICODE /DWIN32 /D_WINDOWS /c

#include <windows.h>
#include <stdlib.h>
#include <string.h>
#include <tchar.h>

#include <dshow.h>

// Global variables

// The main window class name.
static TCHAR szWindowClass[] = _T("win32app");

// The string that appears in the application's title bar.
static TCHAR szTitle[] = _T("Win32 Guided Tour Application");

HINSTANCE hInst;

// Forward declarations of functions included in this code module:
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);

int WINAPI WinMain(HINSTANCE hInstance,
 HINSTANCE hPrevInstance,
 LPSTR lpCmdLine,
 int nCmdShow)
{
 WNDCLASSEX wcex;

 wcex.cbSize = sizeof(WNDCLASSEX);
 wcex.style          = CS_HREDRAW | CS_VREDRAW;
 wcex.lpfnWndProc    = WndProc;
 wcex.cbClsExtra     = 0;
 wcex.cbWndExtra     = 0;
 wcex.hInstance      = hInstance;
 wcex.hIcon          = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_APPLICATION));
 wcex.hCursor        = LoadCursor(NULL, IDC_ARROW);
 wcex.hbrBackground  = (HBRUSH)(COLOR_WINDOW+1);
 wcex.lpszMenuName   = NULL;
 wcex.lpszClassName  = szWindowClass;
 wcex.hIconSm        = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_APPLICATION));

 if (!RegisterClassEx(&wcex))
 {
  MessageBox(NULL,
   _T("Call to RegisterClassEx failed!"),
   _T("Win32 Guided Tour"),
   NULL);

  return 1;
 }

 hInst = hInstance; // Store instance handle in our global variable

 // The parameters to CreateWindow explained:
 // szWindowClass: the name of the application
 // szTitle: the text that appears in the title bar
 // WS_OVERLAPPEDWINDOW: the type of window to create
 // CW_USEDEFAULT, CW_USEDEFAULT: initial position (x, y)
 // 500, 100: initial size (width, length)
 // NULL: the parent of this window
 // NULL: this application does not have a menu bar
 // hInstance: the first parameter from WinMain
 // NULL: not used in this application
 HWND hWnd = CreateWindow(
  szWindowClass,
  szTitle,
  WS_OVERLAPPEDWINDOW,
  CW_USEDEFAULT, CW_USEDEFAULT,
  500, 400,
  NULL,
  NULL,
  hInstance,
  NULL
  );

 if (!hWnd)
 {
  MessageBox(NULL,
   _T("Call to CreateWindow failed!"),
   _T("Win32 Guided Tour"),
   NULL);

  return 1;
 }

 // The parameters to ShowWindow explained:
 // hWnd: the value returned from CreateWindow
 // nCmdShow: the fourth parameter from WinMain
 ShowWindow(hWnd,
  nCmdShow);
 UpdateWindow(hWnd);

 // Main message loop:
 MSG msg;
 while (GetMessage(&msg, NULL, 0, 0))
 {
  TranslateMessage(&msg);
  DispatchMessage(&msg);
 }

 return (int) msg.wParam;
}

//
//  FUNCTION: WndProc(HWND, UINT, WPARAM, LPARAM)
//
//  PURPOSE:  Processes messages for the main window.
//
//  WM_PAINT    - Paint the main window
//  WM_DESTROY  - post a quit message and return
//
//
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
 PAINTSTRUCT ps;
 HDC hdc;
 TCHAR greeting[] = _T("Hello, World!");

 IGraphBuilder *pGraph = NULL;
 IMediaControl *pControl = NULL;
 IMediaEvent   *pEvent = NULL;
 IVideoWindow  *pVideoWindow = NULL;

 HRESULT hr = CoInitialize(NULL);// COM ライブラリを初期化する。

 switch (message)
 {
 case WM_CREATE://ウインドウ作成時の処理

  // フィルタ グラフ マネージャを作成し、インターフェイスを問い合わせる。
  hr = CoCreateInstance(CLSID_FilterGraph, NULL, CLSCTX_INPROC_SERVER, 
   IID_IGraphBuilder, (void **)&pGraph);
  if (FAILED(hr))
  {
   printf("ERROR - Could not create the Filter Graph Manager.");
   
  }

  hr = pGraph->QueryInterface(IID_IMediaControl, (void **)&pControl);
  hr = pGraph->QueryInterface(IID_IMediaEvent, (void **)&pEvent);

  hr = pGraph->QueryInterface(IID_IVideoWindow, (LPVOID*)&pVideoWindow);
  
  // グラフを作成する。 重要 : この文字列をシステム上のファイルに置き換える。
  hr = pGraph->RenderFile(L"E:\\sampleMovie\\avi_divx5_mp3.avi", NULL);

  // 描画先ウィンドウの設定
  hr = pVideoWindow->put_Owner((OAHWND)hWnd);
  hr = pVideoWindow->put_WindowStyle(WS_CHILD|WS_CLIPSIBLINGS);
  hr = pVideoWindow->put_Visible(OATRUE);

  // グラフを実行する。
  hr = pControl->Run();

  // 描画先ウィンドウ内の描画位置の設定
  pVideoWindow->SetWindowPosition(0, 0, 320, 240);

  pVideoWindow->Release();
  pControl->Release();
  pEvent->Release();
  pGraph->Release();
  CoUninitialize();

  break;
 case WM_PAINT:
  hdc = BeginPaint(hWnd, &ps);

  // Here your application is laid out.
  // For this introduction, we just print out "Hello, World!"
  // in the top left corner.
  //TextOut(hdc,5, 5,greeting, _tcslen(greeting));
  // End application-specific layout section.

  EndPaint(hWnd, &ps);
  break;
 case WM_DESTROY:
  PostQuitMessage(0);
  break;
 default:
  return DefWindowProc(hWnd, message, wParam, lParam);
  break;
 }

 return 0;
}

2 件のコメント:

  1. こんにちは。上に書いてあるソースが実行できないんです。
    映像が読みこまない状態です

    返信削除
  2. DirectShow ファーストステップの解説が詳しいです。
    http://msdn.microsoft.com/ja-jp/library/cc354746.aspx

    返信削除