再生の制御


MCI ウィンドウの操作

基本的な制御は、デフォルトのツールバーがほとんど行ってくれます
しかし、プログラムから再生やストップといった制御を行いたい時もあるでしょう

MCI ウィンドウは、マクロを用いることで簡単に基本的な制御が行えます
再生中のメディアをストップする場合は MCIWndStop() マクロを
一時停止の場合は MCIWndPause() マクロを使います

一時停止したメディアを再生するには MCIWndResume() を用いてください
しかし、一般的なメディアでは MCIWndPlay() からでも再生を続けられるでしょう

LONG MCIWndStop(HWND hwnd);
LONG MCIWndPause(HWND hwnd);
LONG MCIWndResume(HWND hwnd);

どのマクロも、hwnd には MCI ウィンドウのハンドルを指定します
正常終了した場合は 0、そうでなければエラーコードを返します

この他にも MCIWndPlayReverse() を用いることで逆再生ができます
ただし、逆再生はこれをサポートしているメディアでなければ失敗します
再生するコンテンツの位置は MCIWndHome() で先頭に
MCIWndEnd() でコンテンツの末尾に移動させることができます

LONG MCIWndReverse(HWND hwnd);
LONG MCIWndHome(HWND hwnd);
LONG MCIWndEnd(HWND hwnd);

やはり、hwnd には MCI ウィンドウのハンドルを指定します
正常終了した場合は 0、そうでなければエラーコードを返します
/*resource.h*/
#define IDM_OPEN 100

#define IDM_PLAY 200
#define IDM_REVERSE 201
#define IDM_STOP 202
#define IDM_END 203
#define IDM_PAUSE 204
#define IDM_RESUME 205
/*リソーススクリプト*/
#include "resource.h"
KITTY MENU {
	POPUP "File(&F)" {
		MENUITEM "Open(&O)" , IDM_OPEN
	}
	POPUP "Play(&P)" {
		MENUITEM "Play(&P)" , IDM_PLAY
		MENUITEM "Reverse(&B)" , IDM_REVERSE
		MENUITEM "Stop(&S)" , IDM_STOP
		MENUITEM "To End(&E)" , IDM_END
		MENUITEM "Pause(&A)" , IDM_PAUSE
		MENUITEM "Resume(&R)" , IDM_RESUME
	}
}
#include <windows.h>
#include <vfw.h>
#include "resource.h"
#define TITLE TEXT("Kitty on your lap")

LRESULT CALLBACK WndProc(HWND hWnd , UINT msg , WPARAM wp , LPARAM lp) {
	static HWND hMCI;
	static OPENFILENAME ofn;
	static TCHAR strFile[MAX_PATH];

	switch (msg) {
	case WM_DESTROY:
		MCIWndDestroy(hMCI);
		PostQuitMessage(0);
		return 0;
	case WM_CREATE:
		ofn.lStructSize = sizeof (OPENFILENAME);
		ofn.hwndOwner = hWnd;
		ofn.lpstrFilter = TEXT("Mdia File \0*.avi;*.mpg;*.wav\0");
		ofn.nMaxCustFilter = 256;
		ofn.nFilterIndex = 0;
		ofn.lpstrFile = strFile;
		ofn.nMaxFile = MAX_PATH;
		ofn.Flags = OFN_FILEMUSTEXIST;
		
		hMCI = MCIWndCreate(hWnd , ((LPCREATESTRUCT)lp)->hInstance ,
			WS_CHILD | WS_VISIBLE | MCIWNDF_NOPLAYBAR , NULL);
		return 0;
	case WM_COMMAND:
		switch (LOWORD(wp)) {
		case IDM_OPEN:
			if (GetOpenFileName(&ofn)) {
				MCIWndClose(hMCI);
				MCIWndOpen(hMCI , strFile , 0);
				
			}
			break;
		case IDM_PLAY:
			MCIWndPlay(hMCI);
			break;
		case IDM_REVERSE:
			MCIWndPlayReverse(hMCI);
			break;
		case IDM_STOP:
			MCIWndStop(hMCI);
			MCIWndHome(hMCI);
			break;
		case IDM_END:
			MCIWndEnd(hMCI);
			break;
		case IDM_PAUSE:
			MCIWndPause(hMCI);
			break;
		case IDM_RESUME:
			MCIWndResume(hMCI);
			break;
		}
		return 0;
	}
	return DefWindowProc(hWnd , msg , wp , lp);
}

int WINAPI WinMain(HINSTANCE hInstance , HINSTANCE hPrevInstance ,
			PSTR lpCmdLine , int nCmdShow ) {
	HWND hWnd;
	MSG msg;
	WNDCLASS winc;

	winc.style		= CS_HREDRAW | CS_VREDRAW;
	winc.lpfnWndProc	= WndProc;
	winc.cbClsExtra	= winc.cbWndExtra	= 0;
	winc.hInstance		= hInstance;
	winc.hIcon		= LoadIcon(NULL , IDI_APPLICATION);
	winc.hCursor		= LoadCursor(NULL , IDC_ARROW);
	winc.hbrBackground	= (HBRUSH)GetStockObject(WHITE_BRUSH);
	winc.lpszMenuName	= TEXT("KITTY");
	winc.lpszClassName	= TEXT("KITTY");

	if (!RegisterClass(&winc)) return -1;

	hWnd = CreateWindow(
			TEXT("KITTY") , TITLE ,
			WS_OVERLAPPEDWINDOW | WS_VISIBLE ,
			CW_USEDEFAULT , CW_USEDEFAULT ,
			CW_USEDEFAULT , CW_USEDEFAULT ,
			NULL , NULL , hInstance , NULL
	);
	if (hWnd == NULL) return -1;

	while(GetMessage(&msg , NULL , 0 , 0)) {
		TranslateMessage(&msg);
		DispatchMessage(&msg);
	}
	return msg.wParam;
}
©KANEKO , アストロビジョン , CULTURE PUBLISHERS
PSゲーム「ひざの上の同居人〜Kitty on your lap〜」より
©KANEKO, アストロビジョン, CULTURE PUBLISHERS
ジーク猫耳!

このプログラムには、基本的な MCI ウィンドウのツールバーを表示しません
そのため、メニューで基本的な操作項目をサポートしています

このプログラムは、簡単のためメニューの無効化処理を省略していますが
本来ならば、再生中に「Play」や「Resume」項目は無効にするべきですし
「Pause」を押した時は、「Resume」以外の項目は無効にするべきだと考えられます
実際、「Stop」項目を押した後「Resume」ボタンを押せば MCI はエラーを発生させます


MCIWndStop()

LONG MCIWndStop(HWND hwnd);

コンテンツの再生を停止します

hwnd - MCI ウィンドウのハンドルを指定します

戻り値 - 正常終了した場合は 0、そうでなければエラーコード

MCIWndPause()

LONG MCIWndPause(HWND hwnd);

コンテンツの再生を一時停止します

hwnd - MCI ウィンドウのハンドルを指定します

戻り値 - 正常終了した場合は 0、そうでなければエラーコード

MCIWndResume()

LONG MCIWndResume(HWND hwnd);

一時停止中のコンテンツをその場から再生します

hwnd - MCI ウィンドウのハンドルを指定します

戻り値 - 正常終了した場合は 0、そうでなければエラーコード

MCIWndReverse()

LONG MCIWndReverse(HWND hwnd);

コンテンツを逆再生します

hwnd - MCI ウィンドウのハンドルを指定します

戻り値 - 正常終了した場合は 0、そうでなければエラーコード

MCIWndHome()

LONG MCIWndHome(HWND hwnd);

現在の位置からコンテンツの先頭に移動します

hwnd - MCI ウィンドウのハンドルを指定します

戻り値 - 正常終了した場合は 0、そうでなければエラーコード

MCIWndEnd()

LONG MCIWndEnd(HWND hwnd);

現在の位置から、コンテンツの終端に移動します

hwnd - MCI ウィンドウのハンドルを指定します

戻り値 - 正常終了した場合は 0、そうでなければエラーコード



前のページへ戻る次のページへ