ソフトウェア開発 Win32プログラミング

マルチメディア ファイルを再生する

戻る


MCIWndというウィンドウを使えば、AVI形式の動画ファイルやMIDI形式の音楽ファイルなどのさまざまなマルチメディア ファイルを簡単に再生することができる。

以下のコードは、MCIWndを用いてマルチメディア ファイルを再生する例である。

#include <windows.h>
#include <vfw.h>
 
#pragma commend(lib, "vfw32.lib")

HINSTANCE g_hInstance;
HWND g_hMainWnd;
HWND g_hwndMCI;
BOOL g_fMCIOpen;
INT g_nRepeat = -1; // 繰り返し再生の回数
BOOL g_fControlling = FALSE;
 
static const TCHAR g_szClassName[] = TEXT("MCI test");
static const TCHAR g_szAppName[] = TEXT("MCI test");
 
LRESULT CALLBACK
WindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    HDC hdc;
    PAINTSTRUCT ps;
    HDROP hDrop;
    TCHAR szFileName[MAX_PATH];
 
    switch(uMsg)
    {
    case WM_CREATE:
        g_hwndMCI = MCIWndCreate(hWnd, g_hInstance,
            MCIWNDF_NOPLAYBAR | MCIWNDF_NOMENU | MCIWNDF_NOTIFYMODE, NULL);
        if (g_hwndMCI == NULL)
            return -1;
        SetWindowPos(g_hwndMCI, NULL, 0, 0, 0, 0, SWP_NOZORDER);
        DragAcceptFiles(hWnd, TRUE);
        g_fMCIOpen = FALSE;
        break;
 
    case WM_DROPFILES:
        // ファイルがドロップされたときの処理。
        hDrop = (HDROP)wParam;
        DragQueryFile(hDrop, 0, szFileName, MAX_PATH);
        if (g_fMCIOpen)
        {
            g_fControlling = TRUE;
            MCIWndStop(g_hwndMCI);
            MCIWndClose(g_hwndMCI);
            g_fControlling = FALSE;
        }
        if (g_nRepeat > 0 || g_nRepeat == -1)
        {
            MCIWndOpen(g_hwndMCI, szFileName, 0);
            MCIWndPlay(g_hwndMCI);
            SetWindowText(hWnd, szFileName);
            g_fMCIOpen = TRUE;
            if (g_nRepeat != -1)
                g_nRepeat--;
        }
        break;
 
    case WM_PAINT:
        hdc = BeginPaint(hWnd, &ps);
        if (hdc != NULL)
        {
            static const TCHAR msg[] = TEXT("ファイルをドロップせよ。");
            TextOut(hdc, 0, 0, msg, lstrlen(msg));
            EndPaint(hWnd, &ps);
        }
        break;
 
    case MCIWNDM_NOTIFYMODE:
        if (lParam == MCI_MODE_PLAY)
        {
            // 親ウィンドウの大きさをMCIウィンドウに合わせる。
            RECT rc;
            GetWindowRect(g_hwndMCI, &rc);
            if (rc.right - rc.left < 100)
                rc.right = rc.left + 100;
            if (rc.bottom - rc.top < 10)
                rc.bottom = rc.top + 32;
            MapWindowPoints(hWnd, NULL, (POINT *)&rc, 2);
            AdjustWindowRect(&rc, WS_OVERLAPPEDWINDOW, FALSE);
            SetWindowPos(hWnd, NULL, 0, 0, rc.right - rc.left, rc.bottom - rc.top,
                         SWP_NOMOVE | SWP_NOZORDER);
        }
        else if (lParam == MCI_MODE_STOP && !g_fControlling)
        {
            // 指定された回数だけ繰り返し再生する。
            if (g_nRepeat == 0)
                break;
            if (g_nRepeat != -1)
                g_nRepeat--;
            MCIWndPlay(g_hwndMCI);
        }
        break;
 
    case WM_DESTROY:
        if (g_fMCIOpen)
        {
            g_fControlling = TRUE;
            MCIWndStop(g_hwndMCI);
            MCIWndClose(g_hwndMCI);
            g_fControlling = FALSE;
        }
        MCIWndDestroy(g_hwndMCI);
        PostQuitMessage(0);
        break;
 
    default:
        return DefWindowProc(hWnd, uMsg, wParam, lParam);
    }
    return 0;
}
 
INT WINAPI WinMain(
    HINSTANCE   hInstance,
    HINSTANCE   hPrevInstance,
    LPSTR       pszCmdLine,
    INT         nCmdShow)
{
    ...
}

コンパイルして実行したら、動画ファイルや音声ファイルなどをウィンドウにドラッグ&ドロップしてみてほしい。

MCIWndの欠点は、リソースに埋め込まれたメディアには使えない(ファイルしか受け付けない)ことである。

ソース: mciplay.zip


戻る

©片山博文MZ
katayama.hirofumi.mz@gmail.com

inserted by FC2 system