mcisendstring関数を使ってピクチャーボックスに動画を再生させるプログラムを作っています。
再生中の動画の上に動画と独立した字幕や画像等を表示させたいのですが、
描画させた瞬間動画にかき消されてしまいうまくいきません。
どなたかうまい解決法をご存知の方はいらっしゃいませんでしょうか?
よろしくお願いします。
すみません、追記です。
動画フォーマットはavi(WMV9)です。
字幕はlabelコントロールのbackstyle = 0時のように背景透過の文字だけ状態で動画にのっけてやりたいのですが…
動画を再生させているピクチャーボックスの上にコントロールを乗せてみたり、
bitbltを使ってみたりといろいろ試してみたのですが、
みんな結果は同じでした(一瞬だけ表示されるが、動画が一コマ進むとそれにかき消されてしまう)。
動画を再生しているピクチャーボックスとは独立した、透明の描画領域をピクチャーボックス上に乗せられたらベストなんですが…無理でしょうか?
レイヤードウィンドウ使うとか
早速レイヤードウィンドウについて調べてみました。
…こんな方法があったとは!
バッチリでした。ありがとうございます!(ただ、windows2k以上でしか使えないのが痛いですね…)
で、解決…といいたいところなのですが、もう一点。
レイヤー化したウィンドウは常に動画を再生しているウィンドウの場所に位置させておきたいのですが、動画再生ウィンドウを動かしたときにレイヤーウィンドウをそれに追随させる方法がわかりません…。
VBにはウィンドウが移動したときに発動するイベントは無いですよね?
VB上で各ウィンドウが移動したことを検知する方法はありますでしょうか?
標準でイベントを用意されていないメッセージを拾いたいときは、
サブクラス化するなりローカルフックするなり
ループ内でPeekMessageするなりして自分で拾ってください。
(今回のケースではサブクラス化が一般的。)
拾いたいメッセージを知りたいときは、
Spy++でメッセージを監視しながらWindowを動かしてみるとか。
もっと簡単にやりたいなら、
Timerイベントプロシージャ内で
FormのLeft,Topを調べるとか。
なるほど、タイマーを使うっていう手もあるか。
これで事足りそうなんでこれでいってみます。
タイマーコントロールって常時回してると重くなるかな…?
ともあれ、ありがとうございました!
> タイマーコントロールって常時回してると重くなるかな…?
タイマーコントロールは別に回ったりしていません。
10msec〜55msec間隔で常時送りつけられているWM_TIMERを
拾っている(ハンドラでコールバックしている)だけです。
(まあ、ハンドラが回ってる、といえば回ってますが・・・)
Windowがある限り、なにもしなくてもハンドラは勝手に回ってますから、
気にすることはないのではないかと。
ツイート | ![]() |