開発環境 Microsoft Visual Studio Express 2013 for Windows Desktop
実行環境 Microsoft Windows 8.1 (64bit)
プロジェクトの種類 Visual C++/Win32 プロジェクト
プロジェクト名 MFPlayTest
アプリケーションの種類 Windows アプリケーション
追加のオプション 空のプロジェクト、SDLチェック

参考

MFPlayTest.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);
}
 
最終更新:2014年07月17日 16:19