開発環境 Microsoft Visual C++ 2010 Express (SP1)
実行環境 Microsoft Windows XP Home Edition (SP3)
プロジェクトの種類 Win32 プロジェクト
プロジェクト名 dshow2
アプリケーションの種類 Windows アプリケーション
追加のオプション 空のプロジェクト
文字セット Unicode

参考

dshow2.cpp
// Unicode文字セット
#pragma comment(lib, "strmiids.lib")
 
#include <DShow.h>
#include <evr.h>
 
#define SAFE_RELEASE(x) { if (x) { x->Release(); x = NULL; } }
#define CLASS_NAME TEXT("dshow2")
#define WINDOW_NAME TEXT("dshow2")
 
// 関数プロトタイプ宣言
HRESULT OpenFile(HWND hWnd, LPCWSTR pszFileName);
HRESULT InitEvr(HWND hWnd);
HRESULT SetVideoPos(HWND hWnd, int nMode);
LRESULT CALLBACK MainWndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
 
// 外部変数構造体
static struct {
	IGraphBuilder *pGraph;
	IMediaControl *pControl;
	IMFVideoDisplayControl *pVideo;
	SIZE size;
	int nPlay;
} g;
 
//==============================================================================
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
	WNDCLASSEX wcx;
	HWND hWnd;
	MSG msg = {NULL};
	HRESULT hr;
 
	// COMライブラリの初期化
	hr = CoInitialize(NULL);
	if (FAILED(hr)) {
		return 0;
	}
 
	// ウィンドウクラスの登録
	ZeroMemory(&wcx, sizeof wcx);
	wcx.cbSize		= sizeof wcx;
	wcx.style		= CS_HREDRAW | CS_VREDRAW;
	wcx.lpfnWndProc		= MainWndProc;
	wcx.hInstance		= hInstance;
	wcx.hCursor		= LoadCursor(NULL, MAKEINTRESOURCE(IDC_ARROW));
//	wcx.hbrBackground	= (HBRUSH)(COLOR_WINDOW + 1);	// 黒がいいかも
	wcx.lpszClassName	= CLASS_NAME;
	if (RegisterClassEx(&wcx) == 0) {
		goto Exit;
	}
 
	// ウィンドウの作成
	hWnd = CreateWindow(CLASS_NAME, WINDOW_NAME,
		WS_OVERLAPPEDWINDOW,
//		CW_USEDEFAULT, 0, CW_USEDEFAULT, 0,
		100, 100, 640, 480,
		NULL, NULL, hInstance, NULL);
	if (hWnd == NULL) {
		goto Exit;
	}
 
	// DirectShowフィルタの準備
	hr = OpenFile(hWnd, L"c:\\tmp\\hoge.mp4");
	if (FAILED(hr)) {
		goto Exit;
	}
 
	ShowWindow(hWnd, nCmdShow);
 
	// 動画再生
	hr = g.pControl->Run();
	g.nPlay = 1;
 
	// メッセージループ
	do {
		Sleep(1);
		if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) {
			TranslateMessage(&msg);
			DispatchMessage(&msg);
		}
	} while (msg.message != WM_QUIT);
 
	// 動画停止
	hr = g.pControl->Stop();
	Sleep(1000);
Exit:
	SAFE_RELEASE(g.pVideo);
	SAFE_RELEASE(g.pControl);
	SAFE_RELEASE(g.pGraph);
	CoUninitialize();
	return msg.wParam;
}
 
//------------------------------------------------------------------------------
HRESULT OpenFile(HWND hWnd, LPCWSTR pszFile)
{
	// フィルタグラフの作成
	HRESULT hr = CoCreateInstance(CLSID_FilterGraph, NULL, CLSCTX_INPROC_SERVER,
		IID_PPV_ARGS(&g.pGraph));
 
	// メディアコントロールインターフェイスの取得
	if (SUCCEEDED(hr)) {
		hr = g.pGraph->QueryInterface(IID_PPV_ARGS(&g.pControl));
	}
 
	// ビデオの作成
	if (SUCCEEDED(hr)) {
		hr = InitEvr(hWnd);
	}
	// グラフを作成する
	if (SUCCEEDED(hr)) {
		hr = g.pGraph->RenderFile(pszFile, NULL);
	}
 
	// 描画領域の設定
	if (SUCCEEDED(hr)) {
		g.pVideo->GetNativeVideoSize(&g.size, NULL);
	}
	if (SUCCEEDED(hr)) {
		hr = SetVideoPos(hWnd, 2);
	}
	return hr;
}
 
//------------------------------------------------------------------------------
HRESULT InitEvr(HWND hWnd)
{
	IBaseFilter *pEvr = NULL;
 
	// EVRの作成
	HRESULT hr = CoCreateInstance(CLSID_EnhancedVideoRenderer, NULL, CLSCTX_INPROC_SERVER,
		IID_PPV_ARGS(&pEvr));
 
	// フィルタグラフにEVRを追加
	if (SUCCEEDED(hr)) {
		hr = g.pGraph->AddFilter(pEvr, L"EVR");
	}
 
	IMFGetService *pService = NULL;
	if (SUCCEEDED(hr)) {
		hr = pEvr->QueryInterface(IID_PPV_ARGS(&pService));
	}
	if (SUCCEEDED(hr)) {
		hr = pService->GetService(MR_VIDEO_RENDER_SERVICE, IID_PPV_ARGS(&g.pVideo));
	}
	SAFE_RELEASE(pService);
 
	if (SUCCEEDED(hr)) {
		hr = g.pVideo->SetVideoWindow(hWnd);
	}
	SAFE_RELEASE(pEvr);
	return hr;
}
 
//------------------------------------------------------------------------------
HRESULT SetVideoPos(HWND hWnd, int nMode)
{
	MFVideoNormalizedRect mvnr = {0.0f, 0.0f, 1.0f, 1.0f};
	RECT rcDst;
 
	if (1 <= nMode && nMode <= 4) {
		SetRect(&rcDst, 0, 0, g.size.cx * nMode / 2, g.size.cy * nMode / 2);
		AdjustWindowRectEx(&rcDst, WS_OVERLAPPEDWINDOW, FALSE, 0);
		SetWindowPos(hWnd, NULL, 0, 0, rcDst.right - rcDst.left, rcDst.bottom - rcDst.top,
			SWP_NOZORDER | SWP_NOMOVE);
	}
	GetClientRect(hWnd, &rcDst);
	return g.pVideo->SetVideoPosition(&mvnr, &rcDst);
}
 
//------------------------------------------------------------------------------
LRESULT CALLBACK MainWndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
	switch (uMsg) {
	case WM_CHAR:
		switch (wParam) {
		case VK_SPACE:
			if (g.nPlay) {
				g.pControl->Pause();
				g.nPlay = 0;
			} else {
				g.pControl->Run();
				g.nPlay = 1;
			}
			break;
		case 's':
			g.pControl->StopWhenReady();
			g.nPlay = 0;
			break;
		case '1': case '2': case '3': case '4':
			SetVideoPos(hWnd, wParam - '0');
			break;
		case VK_ESCAPE:
			DestroyWindow(hWnd);
			break;
		}
		break;
	case WM_SIZE:
		SetVideoPos(hWnd, 0);
		break;
	case WM_DESTROY:
		PostQuitMessage(0);
		break;
	default:
		return DefWindowProc(hWnd, uMsg, wParam, lParam);
	}
	return 0;
}
 

dshow2_fullscreen.cpp
+ ...
// Unicode文字セット
#pragma comment(lib, "strmiids.lib")
#pragma comment(lib, "d3d9.lib")
 
#include <DShow.h>
#include <d3d9.h>
#include <vmr9.h>
 
#define SAFE_RELEASE(x) { if (x) { x->Release(); x = NULL; } }
#define CLASS_NAME TEXT("dshow2")
#define WINDOW_NAME TEXT("dshow2")
 
// 関数プロトタイプ宣言
HRESULT OpenFile(HWND hWnd, LPCWSTR pszFileName);
LRESULT CALLBACK MainWndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
 
// 外部変数構造体
static struct {
	IGraphBuilder *pGraph;
	IMediaControl * pControl;
	IBaseFilter *pVideo;
	IVMRWindowlessControl9 *pWndless;
	ICaptureGraphBuilder2 *pCapture;
} g;
 
//==============================================================================
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
	WNDCLASSEX wcx;
	HWND hWnd;
	MSG msg = {NULL};
	HRESULT hr;
 
	// COMの初期化
	hr = CoInitialize(NULL);
	if (FAILED(hr)) {
		goto Exit;
	}
 
	// ウィンドウクラスの登録
	ZeroMemory(&wcx, sizeof wcx);
	wcx.cbSize		= sizeof wcx;
	wcx.style		= CS_HREDRAW | CS_VREDRAW;
	wcx.lpfnWndProc		= MainWndProc;
	wcx.hInstance		= hInstance;
	wcx.hCursor		= LoadCursor(NULL, MAKEINTRESOURCE(IDC_ARROW));
	wcx.hbrBackground	= (HBRUSH)(COLOR_WINDOW + 1);	// 黒がいいかも
	wcx.lpszClassName	= CLASS_NAME;
	if (RegisterClassEx(&wcx) == 0) {
		goto Exit;
	}
 
	// ウィンドウの作成
	hWnd = CreateWindow(CLASS_NAME, WINDOW_NAME,
		WS_POPUPWINDOW,
		CW_USEDEFAULT, 0, CW_USEDEFAULT, 0,
//		100, 100, 640, 480,
		NULL, NULL, hInstance, NULL);
	if (hWnd == NULL) {
		goto Exit;
	}
 
	//----------------------------------------------------------------------
	LPDIRECT3D9 pD3D = NULL;
	LPDIRECT3DDEVICE9 pD3DDev = NULL;
	D3DPRESENT_PARAMETERS d3dpp;
 
	// Direct3Dの初期化
	pD3D = Direct3DCreate9(D3D_SDK_VERSION);
	if (pD3D == NULL) {
		goto Exit;
	}
	ZeroMemory(&d3dpp, sizeof d3dpp);
	d3dpp.BackBufferWidth	= GetSystemMetrics(SM_CXSCREEN);
	d3dpp.BackBufferHeight	= GetSystemMetrics(SM_CYSCREEN);
	d3dpp.BackBufferFormat	= D3DFMT_A8R8G8B8;
//	d3dpp.MultiSampleType	= D3DMULTISAMPLE_NONE;	// 0
	d3dpp.SwapEffect	= D3DSWAPEFFECT_DISCARD;	// 1
	d3dpp.hDeviceWindow	= hWnd;
	d3dpp.Windowed		= FALSE;	// windowed / full-screen
//	d3dpp.AutoDepthStencilFormat = D3DFMT_UNKNOWN;	// 0
//	d3dpp.FullScreen_RefreshRateInHz = D3DPRESENT_RATE_DEFAULT;	// 0
	hr = pD3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd,
		D3DCREATE_HARDWARE_VERTEXPROCESSING, &d3dpp, &pD3DDev);
	if (FAILED(hr)) {
		goto Exit;
	}
 
	// DirectShowフィルタの準備
	hr = OpenFile(hWnd, L"c:\\tmp\\hoge.mp4");
	if (FAILED(hr)) {
		goto Exit;
	}
 
	//----------------------------------------------------------------------
	ShowWindow(hWnd, nCmdShow);
 
	// 動画再生
	hr = g.pControl->Run();
 
	// メッセージループ
	do {
		Sleep(1);
		if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) {
			TranslateMessage(&msg);
			DispatchMessage(&msg);
		}
	} while (msg.message != WM_QUIT);
 
	// 動画停止
	hr = g.pControl->Stop();
	Sleep(1000);
Exit:
	SAFE_RELEASE(g.pCapture);
	SAFE_RELEASE(g.pWndless);
	SAFE_RELEASE(g.pVideo);
	SAFE_RELEASE(g.pControl);
	SAFE_RELEASE(g.pGraph);
 
	SAFE_RELEASE(pD3DDev);
	SAFE_RELEASE(pD3D);
 
	CoUninitialize();
	return msg.wParam;
}
 
//------------------------------------------------------------------------------
HRESULT OpenFile(HWND hWnd, LPCWSTR pszFileName)
{
	//----------------------------------------------------------------------
	// InitGraph
	// フィルタグラフの作成
	HRESULT hr = CoCreateInstance(CLSID_FilterGraph, NULL, CLSCTX_INPROC_SERVER,
		IID_PPV_ARGS(&g.pGraph));
 
	// メディアコントロールインターフェイスの取得
	if (SUCCEEDED(hr)) {
		hr = g.pGraph->QueryInterface(IID_PPV_ARGS(&g.pControl));
	}
 
	//----------------------------------------------------------------------
	// ソースフィルタの生成と登録
	IBaseFilter *pSource = NULL;
	if (SUCCEEDED(hr)) {
		hr = g.pGraph->AddSourceFilter(pszFileName, NULL, &pSource);
	}
 
	//----------------------------------------------------------------------
	// RenderStreams
	// AddFilterByCLSID
	// VMR9フィルタの作成と登録
	if (SUCCEEDED(hr)) {
		hr = CoCreateInstance(CLSID_VideoMixingRenderer9, NULL, CLSCTX_INPROC_SERVER,
			IID_PPV_ARGS(&g.pVideo));
	}
	if (SUCCEEDED(hr)) {
		hr = g.pGraph->AddFilter(g.pVideo, L"VMR-9");
	}
 
	//----------------------------------------------------------------------
	// InitWindowlessVMR9
	// VMR9をウィンドウレスモードにする
	IVMRFilterConfig *pConfig = NULL;	// IVMRFilterConfig9
	if (SUCCEEDED(hr)) {
		hr = g.pVideo->QueryInterface(IID_IVMRFilterConfig9, (LPVOID *)&pConfig);
	}
	if (SUCCEEDED(hr)) {
		hr = pConfig->SetRenderingMode(VMRMode_Windowless);	// VMR9Mode_Windowless = 2
	}
 
	// 描画ウィンドウの指定
	if (SUCCEEDED(hr)) {
		hr = g.pVideo->QueryInterface(IID_PPV_ARGS(&g.pWndless));
	}
	if (SUCCEEDED(hr)) {
		hr = g.pWndless->SetVideoClippingWindow(hWnd);
	}
 
	// pWndless->SetAspectRatioMode(VMR9ARMode_LetterBox);
	SAFE_RELEASE(pConfig);
 
	//----------------------------------------------------------------------
	// CaptureGraphBuilder2インターフェイスの取得
	if (SUCCEEDED(hr)) {
		hr = CoCreateInstance(CLSID_CaptureGraphBuilder2, NULL, CLSCTX_INPROC_SERVER,
			IID_PPV_ARGS(&g.pCapture));
	}
	if (SUCCEEDED(hr)) {
		hr = g.pCapture->SetFiltergraph(g.pGraph);
	}
 
	// フィルタの接続
	if (SUCCEEDED(hr)) {
		hr = g.pCapture->RenderStream(NULL, NULL, pSource, NULL, g.pVideo);
	}
	if (SUCCEEDED(hr)) {
		hr = g.pCapture->RenderStream(NULL, &MEDIATYPE_Audio, pSource, NULL, NULL);
	}
 
	// 描画領域の設定
	LONG lWidth, lHeight;
	RECT rcSrc, rcDst;
	if (SUCCEEDED(hr)) {
		hr = g.pWndless->GetNativeVideoSize(&lWidth, &lHeight, NULL, NULL);
	}
	if (SUCCEEDED(hr)) {
		SetRect(&rcSrc, 0, 0, lWidth, lHeight);
		GetClientRect(hWnd, &rcDst);
		hr = g.pWndless->SetVideoPosition(&rcSrc, &rcDst);
	}
 
	SAFE_RELEASE(pSource);
	return hr;
}
 
//------------------------------------------------------------------------------
LRESULT CALLBACK MainWndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
	switch (uMsg) {
	case WM_CHAR:
		if (wParam == VK_ESCAPE) {
			DestroyWindow(hWnd);
		}
		break;
	case WM_DESTROY:
		PostQuitMessage(0);
		break;
	default:
		return DefWindowProc(hWnd, uMsg, wParam, lParam);
	}
	return 0;
}
 

dshow2_vmr9.cpp
+ ...
// Unicode文字セット
#pragma comment(lib, "strmiids.lib")
 
#include <DShow.h>
#include <d3d9.h>
#include <vmr9.h>
 
#define SAFE_RELEASE(x) { if (x) { x->Release(); x = NULL; } }
#define CLASS_NAME TEXT("dshow2")
#define WINDOW_NAME TEXT("dshow2")
 
// 関数プロトタイプ宣言
HRESULT OpenFile(HWND hWnd, LPCWSTR pszFileName);
HRESULT InitWndlessVMR(HWND hWnd, IGraphBuilder *pGraph, IVMRWindowlessControl9 **ppWndless);
HRESULT SetVideoPos(HWND hWnd, int nMode);
LRESULT CALLBACK MainWndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
 
// 外部変数構造体
static struct {
	IGraphBuilder *pGraph;
	IMediaControl *pControl;
	IVMRWindowlessControl9 *pWndless;
	SIZE size;
	int nPlay;
} g;
 
//==============================================================================
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
	WNDCLASSEX wcx;
	HWND hWnd;
	MSG msg = {NULL};
	HRESULT hr;
 
	// COMライブラリの初期化
	hr = CoInitialize(NULL);
	if (FAILED(hr)) {
		return 0;
	}
 
	// ウィンドウクラスの登録
	ZeroMemory(&wcx, sizeof wcx);
	wcx.cbSize		= sizeof wcx;
	wcx.style		= CS_HREDRAW | CS_VREDRAW;
	wcx.lpfnWndProc		= MainWndProc;
	wcx.hInstance		= hInstance;
	wcx.hCursor		= LoadCursor(NULL, MAKEINTRESOURCE(IDC_ARROW));
//	wcx.hbrBackground	= (HBRUSH)(COLOR_WINDOW + 1);	// 黒がいいかも
	wcx.lpszClassName	= CLASS_NAME;
	if (RegisterClassEx(&wcx) == 0) {
		goto Exit;
	}
 
	// ウィンドウの作成
	hWnd = CreateWindow(CLASS_NAME, WINDOW_NAME,
		WS_OVERLAPPEDWINDOW,
//		CW_USEDEFAULT, 0, CW_USEDEFAULT, 0,
		100, 100, 640, 480,
		NULL, NULL, hInstance, NULL);
	if (hWnd == NULL) {
		goto Exit;
	}
 
	// DirectShowフィルタの準備
	hr = OpenFile(hWnd, L"c:\\tmp\\hoge.mp4");
	if (FAILED(hr)) {
		goto Exit;
	}
 
	ShowWindow(hWnd, nCmdShow);
 
	// 動画再生
	hr = g.pControl->Run();
	g.nPlay = 1;
 
	// メッセージループ
	do {
		Sleep(1);
		if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) {
			TranslateMessage(&msg);
			DispatchMessage(&msg);
		}
	} while (msg.message != WM_QUIT);
 
	// 動画停止
	hr = g.pControl->Stop();
	Sleep(1000);
Exit:
	SAFE_RELEASE(g.pWndless);
	SAFE_RELEASE(g.pControl);
	SAFE_RELEASE(g.pGraph);
	CoUninitialize();
	return msg.wParam;
}
 
//------------------------------------------------------------------------------
HRESULT OpenFile(HWND hWnd, LPCWSTR pszFile)
{
	// フィルタグラフの作成
	HRESULT hr = CoCreateInstance(CLSID_FilterGraph, NULL, CLSCTX_INPROC_SERVER,
		IID_PPV_ARGS(&g.pGraph));
 
	// メディアコントロールインターフェイスの取得
	if (SUCCEEDED(hr)) {
		hr = g.pGraph->QueryInterface(IID_PPV_ARGS(&g.pControl));
	}
 
	// ウィンドウレスコントロールの作成
	if (SUCCEEDED(hr)) {
		hr = InitWndlessVMR(hWnd, g.pGraph, &g.pWndless);
	}
	// グラフを作成する
	if (SUCCEEDED(hr)) {
		hr = g.pGraph->RenderFile(pszFile, NULL);
	}
 
	// 描画領域の設定
	if (SUCCEEDED(hr)) {
		hr = g.pWndless->GetNativeVideoSize(&g.size.cx, &g.size.cy, NULL, NULL);
	}
	if (SUCCEEDED(hr)) {
		hr = SetVideoPos(hWnd, 2);
	}
	return hr;
}
 
//------------------------------------------------------------------------------
HRESULT InitWndlessVMR(HWND hWnd, IGraphBuilder *pGraph, IVMRWindowlessControl9 **ppWndless)
{
	IBaseFilter *pVmr = NULL;
	IVMRWindowlessControl9 *pWndless = NULL;
 
	if (!pGraph || !ppWndless) {
		return E_POINTER;
	}
 
	// VMRを作成する
	HRESULT hr = CoCreateInstance(CLSID_VideoMixingRenderer9, NULL, CLSCTX_INPROC_SERVER,
		IID_PPV_ARGS(&pVmr));
 
	// フィルタグラフにVMRを追加する
	if (SUCCEEDED(hr)) {
		hr = pGraph->AddFilter(pVmr, L"VMR-9");
	}
 
	// レンダリングモードを設定する
	IVMRFilterConfig9 *pConfig = NULL;
	if (SUCCEEDED(hr)) {
		hr = pVmr->QueryInterface(IID_IVMRFilterConfig9, (LPVOID *)&pConfig);
	}
	if (SUCCEEDED(hr)) {
		hr = pConfig->SetRenderingMode(VMR9Mode_Windowless);
	}
	SAFE_RELEASE(pConfig);
 
	// ウィンドウを設定する
	if (SUCCEEDED(hr)) {
		hr = pVmr->QueryInterface(IID_PPV_ARGS(&pWndless));
	}
	if (SUCCEEDED(hr)) {
		hr = pWndless->SetVideoClippingWindow(hWnd);
		if (SUCCEEDED(hr)) {
			*ppWndless = pWndless;
		} else {
			SAFE_RELEASE(pWndless);
		}
	}
	// pWndless->SetAspectRatioMode(VMR9ARMode_LetterBox);
	SAFE_RELEASE(pVmr);
	return hr;
}
 
//------------------------------------------------------------------------------
HRESULT SetVideoPos(HWND hWnd, int nMode)
{
	RECT rcSrc;
	RECT rcDst;
 
	SetRect(&rcSrc, 0, 0, g.size.cx, g.size.cy);
	if (1 <= nMode && nMode <= 4) {
		SetRect(&rcDst, 0, 0, rcSrc.right * nMode / 2, rcSrc.bottom * nMode / 2);
		AdjustWindowRectEx(&rcDst, WS_OVERLAPPEDWINDOW, FALSE, 0);
		SetWindowPos(hWnd, NULL, 0, 0, rcDst.right - rcDst.left, rcDst.bottom - rcDst.top,
			SWP_NOZORDER | SWP_NOMOVE);
	}
	GetClientRect(hWnd, &rcDst);
	return g.pWndless->SetVideoPosition(&rcSrc, &rcDst);
}
 
//------------------------------------------------------------------------------
LRESULT CALLBACK MainWndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
	switch (uMsg) {
	case WM_CHAR:
		switch (wParam) {
		case VK_SPACE:
			if (g.nPlay) {
				g.pControl->Pause();
				g.nPlay = 0;
			} else {
				g.pControl->Run();
				g.nPlay = 1;
			}
			break;
		case 's':
			g.pControl->StopWhenReady();
			g.nPlay = 0;
			break;
		case '1': case '2': case '3': case '4':
			SetVideoPos(hWnd, wParam - '0');
			break;
		case VK_ESCAPE:
			DestroyWindow(hWnd);
			break;
		}
		break;
	case WM_SIZE:
		SetVideoPos(hWnd, 0);
		break;
	case WM_DESTROY:
		PostQuitMessage(0);
		break;
	default:
		return DefWindowProc(hWnd, uMsg, wParam, lParam);
	}
	return 0;
}
 
最終更新:2012年10月18日 16:28