動画の上に字幕や画像を表示させたい

解決


voo  2005-01-16 21:00:13  No: 87848  IP: [192.*.*.*]

mcisendstring関数を使ってピクチャーボックスに動画を再生させるプログラムを作っています。
再生中の動画の上に動画と独立した字幕や画像等を表示させたいのですが、
描画させた瞬間動画にかき消されてしまいうまくいきません。

どなたかうまい解決法をご存知の方はいらっしゃいませんでしょうか?
よろしくお願いします。

編集 削除
voo  2005-01-16 21:26:00  No: 87849  IP: [192.*.*.*]

すみません、追記です。
動画フォーマットはavi(WMV9)です。

字幕はlabelコントロールのbackstyle = 0時のように背景透過の文字だけ状態で動画にのっけてやりたいのですが…
動画を再生させているピクチャーボックスの上にコントロールを乗せてみたり、
bitbltを使ってみたりといろいろ試してみたのですが、
みんな結果は同じでした(一瞬だけ表示されるが、動画が一コマ進むとそれにかき消されてしまう)。

動画を再生しているピクチャーボックスとは独立した、透明の描画領域をピクチャーボックス上に乗せられたらベストなんですが…無理でしょうか?

編集 削除
Say  2005-01-17 07:07:20  No: 87850  IP: [192.*.*.*]

レイヤードウィンドウ使うとか

編集 削除
voo  2005-01-18 01:16:44  No: 87851  IP: [192.*.*.*]

早速レイヤードウィンドウについて調べてみました。

…こんな方法があったとは!
バッチリでした。ありがとうございます!(ただ、windows2k以上でしか使えないのが痛いですね…)

で、解決…といいたいところなのですが、もう一点。
レイヤー化したウィンドウは常に動画を再生しているウィンドウの場所に位置させておきたいのですが、動画再生ウィンドウを動かしたときにレイヤーウィンドウをそれに追随させる方法がわかりません…。

VBにはウィンドウが移動したときに発動するイベントは無いですよね?
VB上で各ウィンドウが移動したことを検知する方法はありますでしょうか?

編集 削除
Say  2005-01-18 03:35:38  No: 87852  IP: [192.*.*.*]

標準でイベントを用意されていないメッセージを拾いたいときは、
サブクラス化するなりローカルフックするなり
ループ内でPeekMessageするなりして自分で拾ってください。
(今回のケースではサブクラス化が一般的。)

拾いたいメッセージを知りたいときは、
Spy++でメッセージを監視しながらWindowを動かしてみるとか。

編集 削除
Say  2005-01-18 03:38:06  No: 87853  IP: [192.*.*.*]

もっと簡単にやりたいなら、
Timerイベントプロシージャ内で
FormのLeft,Topを調べるとか。

編集 削除
voo  2005-01-18 21:12:44  No: 87854  IP: [192.*.*.*]

なるほど、タイマーを使うっていう手もあるか。
これで事足りそうなんでこれでいってみます。
タイマーコントロールって常時回してると重くなるかな…?

ともあれ、ありがとうございました!

編集 削除
Say  2005-01-19 02:06:18  No: 87855  IP: [192.*.*.*]

> タイマーコントロールって常時回してると重くなるかな…?
タイマーコントロールは別に回ったりしていません。
10msec〜55msec間隔で常時送りつけられているWM_TIMERを
拾っている(ハンドラでコールバックしている)だけです。
(まあ、ハンドラが回ってる、といえば回ってますが・・・)
Windowがある限り、なにもしなくてもハンドラは勝手に回ってますから、
気にすることはないのではないかと。

編集 削除