- ベストアンサー
DirectDrawのWindowモードについて
ちょと古い話で恐縮ですが、DirectshowのマルチメディアストリーミングでDirectDrawを使ってレンダリングしたいと思っています。 こまっているのはSetCooperativeLevelで描画させたいウィンドウのハンドルとDDSCL_NORMALを指定しても、そのあと取得できるプライマリサーフェスがデスクトップ全体になってしまいます。 (とうぜんレンダリングするとデスクトップに描画されます) なんとか、ハンドルを指定してウィンドウに描画させたいのですが、WebなどでDirectDrawのWindowモードで立ち上げるサンプルとかご存じないでしょうか?
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
DirectShowのサンプルの中で「ちょうど」というのは見つからなかったのですが、DirectDrawでSetCooperativeLevel()を使っている例として、Samples\C++\Common\ddutil.cppがありました。 この中にCreateFullScreenDisplay()とCreateWindowedDisplay()という関数があります。関数名からして前者がフルスクリーン表示用の初期化、後者がウィンドウ内表示用の初期化と思われます。「ウィンドウは用意するがデスクトップ全体をプライマリサーフェスにする」なんていう関数を用意しても使い道がないので、おそらくウィンドウの中だけプライマリサーフェスになるのではないかと思います。
その他の回答 (2)
- xcrOSgS2wY
- ベストアンサー率50% (1006/1985)
うーーーん、去年仕事でDirectDrawについて調べまくったとき、その手のサンプルがあったと思ったのですが・・・ちょっと探してみますね。 ※メディアプレーヤー等で動画を再生するときは、(アクセラレーションをオフにしていなければ)明らかにウィンドウ内にある再生領域がDirectDrawサーフェスになってますよね。
- xcrOSgS2wY
- ベストアンサー率50% (1006/1985)
DirectShow+DiretDrawサーフェースは組み合わせたことがないので確かなことは言えないのですが、SetCooperativeLevel()の問題だけだとすれば、DirectX9のサンプル(Samplesフォルダ以下)のソースをSetCooperativeLevelで検索すると、いくつか使用しているものがあります。 明らかにフルスクリーンというのもあれば、ウィンドウモードなのではないかと思うものもあるので、ひとまずヒットしたものを片っ端からビルドして実行してみてはいかがでしょうか。
お礼
ありがとうございます。 grepで調べてみましたがSetCooperativeLevelを使ってるのはIDirectSound8とIDirectInputDevice8のメソッドみたいです。 DirectshowでDirectDrawで描画するサンプルもあるのですが排他モードなんです。 やっぱDirectDrawは使うなってことなんでしょうか… 知りたいのはWindowモードでのプライマリサーフェスがウィンドウのクライアント領域になるかどうかということです。 考えてみるとプライマリサーフェスがデスクトップ全体ということは当たり前のことなのかもしれないと思ってきました。
お礼
ありがとうございます。バージョンのせいか、私の環境にはddutil.cppがありませんでした。 古い本のDirectx5のサンプルが手に入りましたので試したところ、Windowモードのプライマリーサーフェスはデスクトップ全体だとわかりました。その後GetClientRectをしてその領域にBltするみたいです。 なんか思っていたのと違いますが、疑問はとけました。 長々とお付き合いありがとうございました。