|開発環境|Microsoft Visual Studio Express 2013 for Windows Desktop| |実行環境|Microsoft Windows 8.1 (64bit)| |プロジェクトの種類|Visual C++/Win32 プロジェクト| |プロジェクト名|MFPlayTest| |アプリケーションの種類|Windows アプリケーション| |追加のオプション|空のプロジェクト、SDLチェック| #table_zebra(project, #fff, #eee) 参考 -[[Media Foundation ① MFPlay>http://blogs.msdn.com/b/hiroyuk/archive/2009/06/01/9674182.aspx]] MFPlayTest.cpp #highlight(cpp){{ #pragma comment(lib, "mfplay") #include <Windows.h> #include <CommCtrl.h> #include <mfplay.h> template <class T> void SafeRelease(T **ppT) { if (*ppT) { (*ppT)->Release(); *ppT = NULL; } } #define IDC_VIDEO 1000 #define IDC_TRACK 1001 #define TRACK_HEIGHT 30 // 外部変数 HINSTANCE g_hInstance; HWND g_hVideo; HWND g_hTrack; IMFPMediaPlayer *g_pPlayer = NULL; // 関数プロトタイプ宣言 LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam); void OnCreate(HWND hWnd); void OnSize(WPARAM wParam, LPARAM lParam); void OnDropFiles(WPARAM wParam); void OnHScroll(); void OnKeyDown(WPARAM wParam); void PlayVideo(HWND hWnd, const WCHAR *sURL); //============================================================================== int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE, PWSTR, int nCmdShow) { g_hInstance = hInstance; WNDCLASS wc = {}; wc.lpfnWndProc = WndProc; wc.hInstance = hInstance; wc.hCursor = LoadCursor(NULL, IDC_ARROW); wc.lpszClassName = L"MFPlayTest"; if (RegisterClass(&wc) == 0) { return 0; } HWND hWnd = CreateWindowEx(WS_EX_ACCEPTFILES, wc.lpszClassName, L"MFPlayTest", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL); if (hWnd == NULL) { return 0; } ShowWindow(hWnd, nCmdShow); MSG msg; while (GetMessage(&msg, NULL, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); } return msg.wParam; } LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { switch (uMsg) { case WM_HSCROLL: OnHScroll(); return 0; case WM_SIZE: OnSize(wParam, lParam); return 0; case WM_KEYDOWN: OnKeyDown(wParam); return 0; case WM_DROPFILES: OnDropFiles(wParam); DragFinish(HDROP(wParam)); return 0; case WM_CREATE: OnCreate(hWnd); return 0; case WM_DESTROY: SafeRelease(&g_pPlayer); PostQuitMessage(0); return 0; } return DefWindowProc(hWnd, uMsg, wParam, lParam); } void OnCreate(HWND hWnd) { g_hVideo = CreateWindow(L"STATIC", NULL, WS_CHILD | WS_VISIBLE, 0, 0, 640, 360, hWnd, (HMENU)IDC_VIDEO, g_hInstance, NULL); g_hTrack = CreateWindow(TRACKBAR_CLASS, NULL, WS_CHILD | WS_VISIBLE, 0, 360, 640, TRACK_HEIGHT, hWnd, (HMENU)IDC_TRACK, g_hInstance, NULL); } void OnSize(WPARAM wParam, LPARAM lParam) { if (wParam == SIZE_MINIMIZED) return; POINTS pts = MAKEPOINTS(lParam); SetWindowPos(g_hVideo, NULL, 0, 0, pts.x, pts.y - TRACK_HEIGHT, SWP_NOZORDER | SWP_NOMOVE); SetWindowPos(g_hTrack, NULL, 0, pts.y - TRACK_HEIGHT, pts.x, TRACK_HEIGHT, SWP_NOZORDER); } void OnDropFiles(WPARAM wParam) { HDROP hDrop = HDROP(wParam); TCHAR szFile[MAX_PATH]; DragQueryFile(hDrop, 0, szFile, _countof(szFile)); PlayVideo(g_hVideo, szFile); } void OnHScroll() { if (g_pPlayer == NULL) return; int pos = SendMessage(g_hTrack, TBM_GETPOS, 0, 0); PROPVARIANT var; HRESULT hr = g_pPlayer->GetDuration(MFP_POSITIONTYPE_100NS, &var); if (FAILED(hr)) return; LONGLONG dur = var.uhVal.QuadPart; PropVariantClear(&var); var.vt = VT_I8; var.hVal.QuadPart = dur / 100 * pos; hr = g_pPlayer->SetPosition(MFP_POSITIONTYPE_100NS, &var); PropVariantClear(&var); } void OnKeyDown(WPARAM wParam) { switch (wParam) { case VK_SPACE: if (g_pPlayer) { MFP_MEDIAPLAYER_STATE state = MFP_MEDIAPLAYER_STATE_EMPTY; g_pPlayer->GetState(&state); switch (state) { case MFP_MEDIAPLAYER_STATE_PAUSED: case MFP_MEDIAPLAYER_STATE_STOPPED: g_pPlayer->Play(); break; case MFP_MEDIAPLAYER_STATE_PLAYING: g_pPlayer->Pause(); break; } } break; } } void PlayVideo(HWND hWnd, const WCHAR *sURL) { if (g_pPlayer != NULL) return; HRESULT hr = MFPCreateMediaPlayer(sURL, TRUE, 0, NULL, hWnd, &g_pPlayer); } }}