- PR -

動画上へのライン描画について

1
投稿者投稿内容
wild45
会議室デビュー日: 2005/04/06
投稿数: 5
投稿日時: 2007-10-15 13:20
こんにちは。
表題の件についてですが、現在以下のような機能を
実装しようとしていますが、描画したラインがちらついてしまいます。
そんため、描画したラインをちらつかないようにしたいのですが、
どなたかアイデアを拝借できないでしょうか?
(動画の再生には再生用に提供されたAPI(DLL)を使用しています)

[実装しようとしている機能]
・動画再生中にマウスで動画上を2点左クリックし、その点を
 直線で結び表示する。

[現在の実装]
・PictureViewに動画を表示しており、OnPaint()内でラインを描画。
 これではすぐに消えてしまうので、OnTimer()にて、
 InvalidataRect()を行いライン描画範囲を更新。

[その他実施したこと]
・ウィンドウを非表示にし、動画再生用APIへ渡し、そこに表示してもらうようにする。
 非表示ウィンドウからBitBlt()で表示中のウィンドウのメモリDCへ転送。
 メモリDC上でラインを描画し、表示中のウィンドウのDCへ転送し表示。
 (結果)
  非表示ウィンドウからBitBlt()した画像が非表示ウィンドウがある場所の
  キャプチャ画像になり、動画が表示されない。

[環境]
VisualStudio 2005 VC++
動画再生:他者の作成したAPI(DLL)を使用
    →ウィンドウハンドルを渡すとウィンドウサイズに合わせて
     そのウィンドウに動画を表示。
渋木宏明(ひどり)
ぬし
会議室デビュー日: 2004/01/14
投稿数: 1155
お住まい・勤務地: 東京
投稿日時: 2007-10-15 13:49
引用:

(動画の再生には再生用に提供されたAPI(DLL)を使用しています)



てことだと、ほとんど見込はありません。

「動画が表示されたのち」に「線を描画」するのではチラつくのは当たり前です。
次の動画(のコマ)の描画によって、すぐに線は上書きされて消えてしまうからです。

チラつきをなくすには、「線が描かれた動画(のコマ)」を実画面に描画するほかありません。

そして、それが可能かどうかは「提供されている API」の仕様や実装に大きく左右されます。

[quote]
非表示ウィンドウからBitBlt()した画像が非表示ウィンドウがある場所の
キャプチャ画像になり、動画が表示されない。
[quote]

方針としては悪くないんですが、「提供されている API」の仕様がそれを許さないようですね。

ウィンドウではなく、DC を指定して動画(のコマ)を描画させてたりりはきっと出来ないんですよね?

[ メッセージ編集済み 編集者: 渋木宏明(ひどり) 編集日時 2007-10-15 13:52 ]
wild45
会議室デビュー日: 2005/04/06
投稿数: 5
投稿日時: 2007-10-15 15:09
ご意見ありがとうございます。

引用:

チラつきをなくすには、「線が描かれた動画(のコマ)」を実画面に描画するほかありません。


うすうす元画像がなければできないとは気づいてはいましたが、
やはりそうですよね。。。

引用:

ウィンドウではなく、DC を指定して動画(のコマ)を描画させてたりりはきっと出来ないんですよね?


一応聞いては見ますが、もともと外部に公開していないものらしく
だめみたいです。。。

ちなみに表示用のウィンドウに透明の画面をかぶせて、
透明のウィンドウにラインを描画するなんていうことはできない
でしょうか?
(画像の上に透明画面を被せてその透明画面にラインを
描画すればちらつかないんじゃないかと、安易に発想してみました。)
YAS
ベテラン
会議室デビュー日: 2006/02/15
投稿数: 59
投稿日時: 2007-10-15 15:37
よい方法ではありませんが,
デスクトップに直接描画してはどうでしょう?
または,直線の形のフォームを作って上に重ねるとか。
wild45
会議室デビュー日: 2005/04/06
投稿数: 5
投稿日時: 2007-10-15 15:56
ご意見ありがとうございます。

引用:

YASさんの書き込み (2007-10-15 15:37) より:
よい方法ではありませんが,
デスクトップに直接描画してはどうでしょう?
または,直線の形のフォームを作って上に重ねるとか。


直接描画とは、どういうことでしょうか?

また、フォームの作成を行ったことがないのですが、
作成の参考になるようなサイトはありますでしょうか?
渋木宏明(ひどり)
ぬし
会議室デビュー日: 2004/01/14
投稿数: 1155
お住まい・勤務地: 東京
投稿日時: 2007-10-15 15:58
引用:

ちなみに表示用のウィンドウに透明の画面をかぶせて、
透明のウィンドウにラインを描画するなんていうことはできない
でしょうか?



「透明なウィンドウを重ねる」パターンだと、Windows 2000, Windows XP 辺りではトップレベルウィンドウしか透明化することが出来ません。

なので、動画表示のウィンドウを動かした時、上に重ねた「透明なウィンドウ」をその動きにあわせて移動させるコードを書かなくてはならないですが、どうしても多少のギクシャク感は出てしまいます。
YAS
ベテラン
会議室デビュー日: 2006/02/15
投稿数: 59
投稿日時: 2007-10-15 16:11
引用:

直接描画とは、どういうことでしょうか?



デスクトップのhDCを取得して,描画します。
前に調べたことをまとめたものがあるので,参考にしてください。
http://homepage1.nifty.com/yasunari/VB/VB2005/DrawToScreen.htm

しかし,ウィンドウを移動したりすると当然,問題が生じます。

引用:

また、フォームの作成を行ったことがないのですが、
作成の参考になるようなサイトはありますでしょうか?



ウィンドウ(フォーム)の形を変えるには?
http://www.atmarkit.co.jp/fdotnet/dotnettips/205nonrecwin/nonrecwin.html

いずれにしても透明ウィンドウの件と同じようにウィンドウを移動させたときにどう追従させるかが問題になると思います。
wild45
会議室デビュー日: 2005/04/06
投稿数: 5
投稿日時: 2007-10-15 18:26
渋木宏明(ひどり)さん、YASさんご意見ありがとうございました。

おそらく用途上それほどウィンドウを動かすことがないため、
透明のウィンドウを重ねる方法か、フォームの作成する方法で
試してみようと思います。ありがとうございました。
1

スキルアップ/キャリアアップ(JOB@IT)