DirectShowのフルスクリーン表示について(未解決でした)


らんす  URL  2004-12-10 02:31:56  No: 55601

すいません、先ほど「解決」したと思って書き込みをしましたが、
解決していませんでしたので、改めてスレを立てました。
DirectShow関係のオブジェクトとして以下の4つを作成しています。

IGraphBuilder* g_pGraph = NULL;
IMediaControl* g_pMediaControl = NULL;
IMediaEvent* g_pEvent = NULL;
IVideoWindow* g_pVidWin = NULL;

で、再生終了後の開放処理を次のような関数を作成しました。
#define RELEASE(x) if(x!=NULL){x->Release();x=NULL;}
void ReleaseDShow(void)
{
    RELEASE(g_pVidWin);
    RELEASE(g_pMediaControl);
    RELEASE(g_pEvent);
    RELEASE(g_pGraph);

    if ( g_pVidWin != NULL ) {
        g_pVidWin->put_Visible(OAFALSE);
        g_pVidWin->put_Owner(NULL);
    }
}

これで正常に動いたと思ったので、先ほどのレスに「解決」として返信しましたが、よく考えたら、g_pVidWinをRelease後、NULLを代入しているので、その下のif文には引っかかりませんよね。
ということは、put_Visible()もput_Owner()も実行されないわけです。

結果、最小化が引き起こされるput_Owner(NULL)を実行していないので、見た目は正常にムービーが再生されていました。

put_Owner(NULL)を実行しなくても、見た目は正常に再生できるんですが、put_Owner(NULL)を実行していないことが処理として正しいのか?
と考えると気持ち悪いです。
現在はとりあえずの案として、次のように関数を修正して使っています。

void ReleaseDShow(void)
{
    if ( g_pVidWin != NULL ) {
        g_pVidWin->put_Visible(OAFALSE);
        //g_pVidWin->put_Owner(NULL);
    }
    RELEASE(g_pVidWin);
    RELEASE(g_pMediaControl);
    RELEASE(g_pEvent);
    RELEASE(g_pGraph);
}

out_Owner(NULL)を実行しない状態で使い続けることに問題はありますでしょうか?
よろしくお願いします。


らんす  URL  2004-12-10 02:47:28  No: 55602

>put_Owner(NULL)のタイミングで最小化するのか、それともDirestShowの
>オブジェクトをReleaseしたタイミングで最小化するのか、どっち?
このコメントを勘違いしていました。
どの「タイミング」で最小化するのか?ということですね。
Release処理を先にやってみろというわけではありませんね。
大変失礼しました。

タイミングですが、put_Owner(NULL)を実行したときです。

Release()の実行をコメントアウトしても最小化されるので、
多分間違いないと思います。

なお、Release()の実行をコメントアウトした場合、
ゲーム画面が最小化され、ムービーの画面は残ったままになりました。
Releaseしていないので、子ウィンドウが削除されていないのであろうということは分かるのですが、put_Owner(NULL)を実行後にput_Visible(OAFALSE)を実行させても、子ウィンドウのムービーが面が表示されるというのが納得いきません。

put_Owner(NULL)により、親子関係を消滅させ、その後のput_Visible(OAFALSE)がゲーム画面のウィンドウに実行されてしまったため、ゲームウィンドウが最小化して、ムービー画面が残っているのかな?
とも思いましたが、put_Visible(OAFALSE)をコメントアウトしても同じ動作をしていました。

よって、put_Owner(NULL)によって、ゲームウィンドウが最小化されるという判断をしました。

何か解決策はありませんでしょうか?
それとも、Release()してしまえば、ムービーのウィンドウが削除されるので、put_Owner(NULL)もput_Visible(OAFALSE)も実行する必要がないと解釈してよろしいのでしょうか?


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加