none
DirectShowで動画を再生している領域上にWPFコントロールを表示したい RRS feed

  • 質問

  • WPF ウィンドウアプリ上に DirecShow を使って動画を再生するアプリを作成しています.

    “DirectShow を使ってコントロールにレンダリングするにはハンドルを取得する必要がある” という事で
    WindowsFormsHost を使って WPF 上に Windows フォームコントロールをホストする方法を採用したのですが,
    WindowsFormsHost の上に WPF のコントロールを被せる事ができずに困っています.

    WindowsFormsHost が WPF 要素の最前面に来るというのは仕様らしいのですが...
    http://msdn.microsoft.com/ja-jp/library/ms744952(VS.80).aspx

    何か解決策はございますでしょうか?
    実現したいのは,映像表示領域の上に Button 等を配置した UserControl を半透明で被せる事です.

    # DirectShow フィルタを直接操作できる訳ではなく,その辺りの処理を隠蔽したモジュールがあり,
    # そのモジュールへ描画コントロールのハンドルを渡す,という事しかできません.

    質問が曖昧で申し訳ありませんが,ご助言頂けると助かります.
    2010年1月27日 12:25

回答

すべての返信

  • 半透明でも空域違反はできないようですね。
    http://msdn.microsoft.com/ja-jp/library/aa970688.aspx

    やったことがないので完全にできるかどうかは分かりませんが、
    Windows フォームの映像表示領域の上でも片隅(隙間がないように)にWPF ウィンドウを作成できるかもしれません。
    http://msdn.microsoft.com/ja-jp/library/aa970266.aspx

    WPF ウィンドウアプリ=>Windows フォームコントロールをホスト(DirectShow)=>WPF ウィンドウをホスト という形です。


    えムナウ@わんくま同盟 Microsoft MVP Visual Studio C# Since 2005/01-2010/12
    2010年1月27日 12:44
  • ご回答有難うございます.

    ご紹介頂いたページと同じ事になるのかどうか分かりませんが,
    WPF ウィンドウアプリ => WindowsFormsHost で フォームコントロールをホスト => ElementForms でWPF コントロールをホスト
    という形で試してみました.

    このやり方だと,映像表示領域 (フォームコントロールの UserControll) の上にWPF の UserControll (Button 含) を
    表示する事ができました.
    しかし,WPF の UserControll を半透明にすると,透けた後ろに見えるのは動画ではなく Windows フォームコントロールの
    背景でした.WPF コントロールを被せていないところだけ動画を描画しているように見えました.

    中々理解が進みませんが,紹介いただいたページをもう少し見てみます.
    2010年1月29日 4:30
  • >しかし,WPF の UserControll を半透明にすると,透けた後ろに見えるのは動画ではなく Windows フォームコントロールの
    >背景でした.WPF コントロールを被せていないところだけ動画を描画しているように見えました.
    そうなると思っていました。
    なので、「片隅(隙間がないように)に」と書いておきました。
    WPF の UserControll は半透明にしない運用を考えてください。

    えムナウ@わんくま同盟 Microsoft MVP Visual Studio C# Since 2005/01-2010/12
    2010年1月29日 7:55
  • 色々調べてみたのですが,考えていた仕様を実現するのは難しそうです.
    ご回答有難うございました.


    > なので、「片隅(隙間がないように)に」と書いておきました。
    "こちらの回答の意味なのですが動画を表示している領域 に隣接する形でしか WPF コントロールを配置できない" という事を
    意味しているのでしょうか?

    私が試した限りでは,ElementForms を隣接させない形で配置すると,動画の上に浮き島のように WPF コントロールを表示できました.
    (半透明がうまくいかないのは相変わらずですが...)

    回答の意味を誤って解釈しているようでしたらお手数ですがご指摘お願いします.
    2010年2月6日 11:20
  • >動画の上に浮き島のように WPF コントロールを表示できました
    そういう風になるということです。

    動画上にパーツを置くとしたら浮島のようだと動画が見づらくて困るでしょうから、片隅なら見づらくないかなと思っただけです。

    えムナウ@わんくま同盟 Microsoft MVP Visual Studio C# Since 2005/01-2010/12
    2010年2月6日 11:26
  • 有難うございます.意図を理解できました.
    2010年2月6日 12:10
  • ところで「DirecShow を使って動画を再生」とありますが、
    WPFで動画を再生ではいけない理由を後学のため教えてくれませんか?


    えムナウ@わんくま同盟 Microsoft MVP Visual Studio C# Since 2005/01-2010/12
    2010年2月6日 12:21
  • "WPF での動画再生がいけない" というよりは, 今の所 "DirectShow を使って動画を再生する" モジュールを使って
    アプリを作成せざるをえないから,というのが答えになってしまいます.

    2010年2月6日 15:30