カクタスソフトウェア
カクタスソフトウェア
サウンド MIDI マルチメディア アプリケーション

IMediaEventEx

グラフ内のイベント処理を行います。演奏が終了した、演奏中に問題が起きたなどのイベントをアプリケーション側に伝えます。

作成

    IMediaEventEx       *m_pME;

    result = m_pGB->QueryInterface(IID_IMediaEventEx, (void **)&m_pME);
    if (FAILED(result))         throw result;

リリース

    SAFE_RELEASE(m_pME);

ハンドルの登録

IMediaEventEx::SetNotifyWindow()関数でメッセージを処理するウィンドウのハンドルを登録します。WM_GRAPHNOTIFYはユーザー定義のメッセージIDでWM_APP以上で適当な値を割り当てます。

define WM_GRAPHNOTIFY WM_APP + 1
    HWND    hWnd;       // アプリケーションウィンドウのハンドル
    result = m_pME->SetNotifyWindow((OAHWND)hWnd, WM_GRAPHNOTIFY, 0);
    if (FAILED(result))     throw result;

登録を解除するときは、NULLを指定します。IMediaEventExインターフェースをリリースする前に必ず登録を解除してください。

    result = m_pME->SetNotifyWindow((OAHWND)NULL, 0, 0);
    if (FAILED(result))     throw result;

アプリケーション側では以下の要領でWM_GRAPHNOTIFYメッセージをディスパッチします。

LRESULT MyAppClass::WindowProc(UINT message, WPARAM wParam, LPARAM lParam) 
{
    switch (message)
    {
    case WM_GRAPHNOTIFY:
        // TODO:
        break;
    }
    return CView::WindowProc(message, wParam, lParam);
}

メッセージのディスパッチにON_MESSAGE()マクロをメッセージマップに埋め込む方法もあります。詳しくは関連するセクションを参照してください。

イベントの検出

WM_GRAPHNOTIFYメッセージを検出したらIMediaEventEx::GetEvent()関数でイベント通知コードおよびパラメータを取得します。

    long lEventCode;
    long lParam1, lParam2;

    if (! m_pME)    return FALSE;

    while (SUCCEEDED(m_pME->GetEvent(&lEventCode, &lParam1, &lParam2, 0)))
    {
        m_pME->FreeEventParams(lEventCode, lParam1, lParam2);

        switch (lEventCode)
        {
        case EC_COMPLETE:
        case EC_USERABORT:
        case EC_ERRORABORT:
            return TRUE;
        }
    }
    return FALSE;

GetEvent()関数の第1引数にイベント通知コードが戻ります。イベント通知コードは多種類定義されていますが、ここでは、正常終了「EC_COMPLETE」と異常終了「EC_USERABORT」、「EC_ERRORABORT」だけをチェックしています。

GetEvent()関数の第2・3引数にパラメータが戻ります。コードによってはここに文字列が渡されることがあり、利用後FreeEventParams()関数でリソースを開放する必要があります。上記の例ではパラメータは参照していません。

ドキュメントの先頭へ

カクタスソフトウェア 技術協力 資料室 資料室の広場 SourceForge.jp お問い合わせ