« ダミーウィンドウへ退避 | メイン | 落ちるのは別の原因 »

2005年11月03日

吉里吉里 ムービー拡張日誌2:: 何も描画されない

    

ウィンドウレスモードで実装してみたが、何も描画されない……
確か、一番初めにウィンドウレスモードで実装して何も描画されなかった気がしたが、ブログに書き忘れていた。
やっぱり、描画されなかったか。
で、自分で子ウィンドウを作って、そこへ描画するようにしても事態は変わらず。
サンプルを何度も見て、違いを追っていろいろ試して何とか解決。

RECT dest;
GetClientRect(hWnd, &dest);
IVMRWindowlessControl9::SetVideoPosition(NULL, &dest);

と言うように、クライアント領域をビデオの出力領域として設定してやらないといけないようだ。
これによって絵が出るようになった。
子ウィンドウかどうかも関係なし。
他のアプリでフルスクリーンに切り替えられたとしても、IVMRWindowlessControl9::DisplayModeChangedを呼んでいれば問題なし。

だがしかし、あんたちょっと奥さん。
吉里吉里でフルスクリーンにしたら絵が出なくなる。
ウィンドウモードに戻しても絵は出ないまま。
IVMRWindowlessControl9::GetCurrentImageと言うメソッドで現在表示中のイメージのコピーを取得しようとしてもエラーが返ってくる。
この時にレンダリングフィルタの接続状態を確認すると接続が解除されてしまっている。
フルスクリーンにした瞬間は問題ないようだが、少ししたら失敗するようになるようだ。

フルスクリーン状態で起動した場合は表示される。
その後、ウィンドウモードにしても表示されている。
が、再度フルスクリーンにしたら消える。
ウィンドウ状態で起動した場合は、フルスクリーンにしたら消える。

GetCurrentImageが失敗するのを使ってどこで失敗しているか見てみると、フルスクリーン化した後のSetVideoClippingWindowのウィンドウ設定時に失敗している。(GetCurrentImageはRepaintVideoをコールした後でないと失敗しないようだ)
フルスクリーン化した後、GetAncestor( OwnerWindow, GA_ROOTOWNER )でルートウィンドウを取得したら、ウィンドウモードの時と変わっている。
このルートウィンドウが変わった時SetVideoClippingWindowで別のウィンドウを設定し、ウィンドウモード戻ってきた時にOwnerWindowで再度ウィンドウを作って、それをSetVideoClippingWindowしたら表示が復活した。
フルスクリーン時に親とするべきウィンドウのハンドルが取得できれば何とかなりそうだが、うまくいかない。
と言うか、フルスクリーン時のウィンドウの構造がよくわからない。


ウィンドウモードからフルスクリーンにした時の、フルスクリーン状態の時のみ表示できないところまできたが、ここからまたなぞ。



投稿者 Takenori : 2005年11月03日 20:32




comments powered by Disqus
Total : Today : Yesterday : なかのひと