#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);
}