• ベストアンサー

DirectDrawのWindowモードについて

ちょと古い話で恐縮ですが、DirectshowのマルチメディアストリーミングでDirectDrawを使ってレンダリングしたいと思っています。 こまっているのはSetCooperativeLevelで描画させたいウィンドウのハンドルとDDSCL_NORMALを指定しても、そのあと取得できるプライマリサーフェスがデスクトップ全体になってしまいます。 (とうぜんレンダリングするとデスクトップに描画されます) なんとか、ハンドルを指定してウィンドウに描画させたいのですが、WebなどでDirectDrawのWindowモードで立ち上げるサンプルとかご存じないでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
  • xcrOSgS2wY
  • ベストアンサー率50% (1006/1985)
回答No.3

DirectShowのサンプルの中で「ちょうど」というのは見つからなかったのですが、DirectDrawでSetCooperativeLevel()を使っている例として、Samples\C++\Common\ddutil.cppがありました。 この中にCreateFullScreenDisplay()とCreateWindowedDisplay()という関数があります。関数名からして前者がフルスクリーン表示用の初期化、後者がウィンドウ内表示用の初期化と思われます。「ウィンドウは用意するがデスクトップ全体をプライマリサーフェスにする」なんていう関数を用意しても使い道がないので、おそらくウィンドウの中だけプライマリサーフェスになるのではないかと思います。

matico
質問者

お礼

ありがとうございます。バージョンのせいか、私の環境にはddutil.cppがありませんでした。 古い本のDirectx5のサンプルが手に入りましたので試したところ、Windowモードのプライマリーサーフェスはデスクトップ全体だとわかりました。その後GetClientRectをしてその領域にBltするみたいです。 なんか思っていたのと違いますが、疑問はとけました。 長々とお付き合いありがとうございました。

その他の回答 (2)

  • xcrOSgS2wY
  • ベストアンサー率50% (1006/1985)
回答No.2

うーーーん、去年仕事でDirectDrawについて調べまくったとき、その手のサンプルがあったと思ったのですが・・・ちょっと探してみますね。 ※メディアプレーヤー等で動画を再生するときは、(アクセラレーションをオフにしていなければ)明らかにウィンドウ内にある再生領域がDirectDrawサーフェスになってますよね。

  • xcrOSgS2wY
  • ベストアンサー率50% (1006/1985)
回答No.1

DirectShow+DiretDrawサーフェースは組み合わせたことがないので確かなことは言えないのですが、SetCooperativeLevel()の問題だけだとすれば、DirectX9のサンプル(Samplesフォルダ以下)のソースをSetCooperativeLevelで検索すると、いくつか使用しているものがあります。 明らかにフルスクリーンというのもあれば、ウィンドウモードなのではないかと思うものもあるので、ひとまずヒットしたものを片っ端からビルドして実行してみてはいかがでしょうか。

matico
質問者

お礼

ありがとうございます。 grepで調べてみましたがSetCooperativeLevelを使ってるのはIDirectSound8とIDirectInputDevice8のメソッドみたいです。 DirectshowでDirectDrawで描画するサンプルもあるのですが排他モードなんです。 やっぱDirectDrawは使うなってことなんでしょうか… 知りたいのはWindowモードでのプライマリサーフェスがウィンドウのクライアント領域になるかどうかということです。 考えてみるとプライマリサーフェスがデスクトップ全体ということは当たり前のことなのかもしれないと思ってきました。

関連するQ&A

  • DirectShowを使用し動画ファイルを再生した時に出てくる「Act

    DirectShowを使用し動画ファイルを再生した時に出てくる「ActiveMovie Window」 を閉じたい 【Directshow, ActiveMovie Window, 閉じる】 DirectShowを使用し動画ファイルを再生した時に出てくる「ActiveMovie Window」 だけを閉じたい場合はどのようにすればよいのでしょうか? 動画処理はフレーム単位で、以下の1~4の処理を繰り返すことで行っています。  1. IMediaSeeking::SetPositions(); // シーク  2. IMediaControl::StopWhenReady(); // シークしてレンダリング  3. IMediaControl::StopWhenReady(); // レンダリング完了を待つ  4. ISampleGrabber::GetCurrentBuffer(); // グラブ 2の処理のところで、 「ActiveMovie Window」が出てきます。 IMediaSeeking, IMediaControl, ISampleGrabber を Release してやればウィンドウも消えるかと思いましたが、別問題のようです。 現在、複数の動画を連続で解析しているため、 「ActiveMovie Window」も複数表示される現象が起こってしまい、困っています。 「ActiveMovie Window」を完全に消す、 もしくは、ウィンドウの表示はひとつだけにするためにはどうしたらよいでしょうか? アドバイスよろしくお願いします。

  • ドラッグ中のWindowを取得

    現在、VisualStudio2008で開発を行っています。 本題ですが、たとえばWindowsのWindowを指定した位置にドラッグ&ドロップした場合、そのWindowのハンドルを取得する方法が知りたいです。 また、vb標準のDrug&Drop機能で取得することは可能でしょうか。 ご存知の方はぜひご伝授ください。

  • window.open でのファイル指定方法

    初心者なので困ってます。 よろしくお願いします。 window.open を使って別ウィンドウでエクセルファイルを開きたい場合、ファイル指定はどうしたらよいでしょうか。 イントラネットのページなので共有のファイルサーバー名からパスを指定していますが 該当ファイルがありません とメッセージが出てしまいます。 ファイル場所 \\fileserver01\folder01\file.xls 記述 window.open("file:///\\fileserver01\folder01\file.xls"); 他のサイトを探してみましたがリンク先がURLのサンプルしか見つかりませんでした。 どなたかファイル名指定の場合の記述方法をご教示下さい。 よろしくお願いします。

  • DirectDrawアクセラレータを有効にする方法

    以下の手順でDirectDrawを有効にしようと試みたのですが、「有効」ボタンが 表示されずに、途方に暮れています。お知恵を拝借したく、宜しくお願い致します。 ■手順  1.Windowsの「スタート」より「ファイル名を指定して実行(R)...」を選択。  2.「ファイル名を指定して実行」の名前ウィンドウに「dxdiag」と入力し、   「OK」ボタンを押下。  3.「DirectX 診断ツール」の起動。  4.上部の「ディスプレイ」のタグを選択後、中央の「DirectXの機能」を選択。  5.「DirectDrawアクセラレータ」「Direct3D アクセラレータ」が   「使用不可」と表示されている箇所の「有効」ボタンを押下。  ※私の環境では、当初からDirect3Dアクセラレータが使用可能となっておりました。 ■やってみたこと  ・Windowsアップデートの実施  ・BIOSアップデートの実施  ・ディスプレイドライバの再インストールとアップデート  ・ディスプレイドライバの無効化(DirectDrawは使用可能となりましたが、   Direct3Dアクセラレータが使用不可となってしまいました。 ■環境  ・使用PC:FMV-BIBLO NF/C70  ・OS:Vista Home Premium 以下環境詳細 ------------------ System Information ------------------ Time of this report: 10/15/2011, 23:08:35 Machine name: 省略 Operating System: Windows Vista? Home Premium (6.0, Build 6002) Service Pack 2 (6002.vistasp2_gdr.110617-0336) Language: Japanese (Regional Setting: Japanese) System Manufacturer: FUJITSU System Model: FMVNFC70W BIOS: Version 1.17 Processor: Intel(R) Core(TM)2 Duo CPU P8600 @ 2.40GHz (2 CPUs), ~2.4GHz Memory: 2002MB RAM Page File: 1220MB used, 3021MB available Windows Dir: C:\Windows DirectX Version: DirectX 11 DX Setup Parameters: /Silent DxDiag Version: 7.00.6002.18107 32bit Unicode ------------ DxDiag Notes ------------ Display Tab 1: No problems found. Sound Tab 1: No problems found. Input Tab: No problems found. -------------------- DirectX Debug Levels -------------------- Direct3D: 0/4 (retail) DirectDraw: 0/4 (retail) DirectInput: 0/5 (retail) DirectMusic: 0/5 (retail) DirectPlay: 0/9 (retail) DirectSound: 0/5 (retail) DirectShow: 0/6 (retail) --------------- Display Devices --------------- Card name: Mobile Intel(R) 4 Series Express Chipset Family Manufacturer: Intel Corporation Chip type: Mobile Intel(R) 4 Series Express Chipset Family DAC type: Internal Device Key: Enum\PCI\VEN_8086&DEV_2A42&SUBSYS_145010CF&REV_07 Display Memory: 776 MB Dedicated Memory: 32 MB Shared Memory: 744 MB Current Mode: 1280 x 800 (32 bit) (60Hz) Monitor: 汎用 PnP モニタ Driver Name: igdumdx32.dll,igd10umd32.dll Driver Version: 8.15.0010.2413 (English) DDI Version: 10 BGRA Supported: Yes Driver Attributes: Final Retail Driver Date/Size: 6/3/2011 13:24:28, 571904 bytes WHQL Logo'd: Yes WHQL Date Stamp: Device Identifier: {D7B78E66-6902-11CF-127A-5A34A7C2C535} Vendor ID: 0x8086 Device ID: 0x2A42 SubSys ID: 0x145010CF Revision ID: 0x0007 Revision ID: 0x0007 Video Accel: Deinterlace Caps: n/a DDraw Status: Not Available D3D Status: Enabled AGP Status: Not Available 以上、宜しくお願い致します。

  • InvalidateRectの使い方について

    InvalidateRectの使い方ですが、ヘルプを見たところ、下記のように表記されていました。 BOOL InvalidateRect( HWND hWnd, // handle of window with changed update region CONST RECT *lpRect, // address of rectangle coordinates BOOL bErase // erase-background flag ); しかし、実際、使ってみると InvalidateRect(&rct,FALSE);とするだけで、コンパイルは通ります。 ※&rctはlpRectのように再描画する領域を指定しています。 私の希望としては、指定した部分だけ再描画をかけ、指定外の部分は、再描画されず、画像がのこり、最終的には一つの絵となって欲しいのですが。 これは引数が2つだから起きているアクシデントなのでしょうか。 InvalidateRctの使い方を教えていただければと思います。よろしくお願いします。

  • X window systemの仕組みについて

    LinuxやFreeBSDのX Window systemについて教えてください。 "X.Org Foundation"前提で構いません。 1)Xはネットワーク通信を介して使われることを前提として設計されている。 2)クライアントサーバ型システムをとっている 3)つまり、たとえばKNOPPIXやPC-BSDなどのLIVE CDを起動して表示されるGUIシステムは、  自分で立てたXサーバ(127.0.0.1)に対して自分がクライアントとして接続しに行っているに過ぎない。 4)よってその気になればMS-Windowsや漢字Talk上でも、クライアントさえあればKNOPPIXのXサーバに  接続してデスクトップを引っ張ってこれる この理解は正しいですか。 これは目的から外れる質問ですが、可能でしたら教えて下さい 4)Windowsシリーズもこのシステムを採用しているのか、あるいは直接入出力デバイスの描画なり入力なり を管理しているのか 5)後者であればWindowsXP sp2のリモートデスクトップシステムの仕組みはX.Orgとはまったく異なる仕組みなのか

  • onloadでウインドウの大きさを

    onloadでウインドウの大きさを指定したいのですが、ファイル名以降の書き方を教えていただけないでしょうか。 下記だとうまくいかないのです。 <BODY onLoad="window.open('sample.html,width=400,height=600;')">

  • 親ウインドウのウインドウハンドルの必要性について

    お願いします。 WIN98 VC++6.0 SDKにて ウインドウをクリックするとダイアログボックスが表示されるサンプルプログラムがあります。 MessageBox(hWnd, s, "ダブルクリック", MB_OK);の第1引数には親ウインドウのウインドウハンドルを指定するとありましたが、NULLに変えても問題無く動きました。 第1引数はなんでも良いのでしょうか? また、必ず親ウインドウのウインドウハンドルを指定しなければならない時はどのような場合でしょうか? よろしくお願いします。

  • ウィンドウサイズを変更するには?

    ウィンドウサイズを変更したいと思っています。別ウィンドウを開く時にサイズを指定するのではなく、現在のウィンドウについてです。 window.resizeTo(wSize, hSize); では外枠を含んだサイズになるようで、インナー(実際見ているサイズ)を指定してあげたいと思っています。IE、NS、MAC、WIN等書き分けないといけないように思いますが、どなたかサンプル等教えて頂けないでしょうか。 よろしくお願い致します。

  • 既存プロセスからプロセスのプライマリースレッドIDの取得方法

    いつもお世話になってます。 プロセスに関することで分からないことがあるため、どなたか御教授して下さい。 只今、VC++で開発を行っているのですが、CreateProcess関数を使用して開始したプロセスの情報が、引数で指定したPROCESS_INFORMATIONにプライマリースレッドのハンドルやIDが設定されるのは知っているのですが、現在動作中のプロセスからそのプロセスのプライマリースレッドのIDを取得することは可能でしょうか? 具体的には、動作中のプロセスIDを指定するとそのプロセスのプライマリースレッドに対してPostThreadMessageで任意のメッセージが送れるという仕様です。 対象のプロセスがウィンドウを持っていれば、EnumWindows関数を使用してウィンドウに対してPostMessageができるというのは分かったのですが、今回対象のプロセスがウィンドウを持たない為、上記のようにスレッドに対してメッセージを送るようになっています。 CreateProcess呼び出し時にはスレッドIDが取得できることから、プロセスID、または、プロセスハンドルからスレッドIDが取得できるのではないかなと考えられるんですが。。。。

専門家に質問してみよう