メディアプレイヤーの上に線を描く


たろう  2008-07-23 09:27:45  No: 100928  IP: 192.*.*.*

VBでメディアプレイヤーで動画を再生させてます。

再生している動画のお上に、円を書きたいです。
モニターの見た目でかまいません。

一つの方法ですが、
透明化の設定をした、フォームを最善面に表示して、
透明化設定以外の色で円を書けば、実装できますが、

大きな領域で、透明化フォームを表示させると、パフォーマンスに
大きな影響がでてしまいます。

他の方法はないでしょうか?

編集 削除
魔界の仮面弁士  2008-07-23 12:54:48  No: 100929  IP: 192.*.*.*

レイヤード ウィンドウのかわりに、
円形のリージョンを切ったウィンドウだとどうでしょう?

編集 削除
 2008-07-23 14:12:47  No: 100930  IP: 192.*.*.*

んー…
描こうとする円自体は、大きいの?
大きくなければ、フォーム自体を小さめにして
フォーム自体を移動させることで何とかならないだろうか?
用途的に合わないかもしれないが…

あと気になったのだが、透明フォームってレガシーVBで
無理やり表示してるの?
もしかして実は.NETのネタだったりしない?

編集 削除
K.J.K.  2008-07-23 16:46:53  No: 100931  IP: 192.*.*.*

アプローチを間違えています。

SDK的には、 IWMPGraphEventHandler などを用いて FilterGraph のインスタンスを取得し、
そこからVMRのインスタンスを得て、そのVMRでミキシングするのでしょう。
# でも、OCX版では使えなかったかも。

一般的には、特殊な表示を行いたい場合は、WMPを使うのではなく、 DirectShow
を直接用いて、そういう機能を持つフィルタを追加するとか、VMRを利用して
合成するように作ります。

編集 削除
hirobo-macros  2008-08-07 14:10:10  No: 100932  IP: 192.*.*.*

フォーム透過OCX Ver 2.00(KTrans32)
とMicrosoft Tablet PC Type Libraryを使用して

それぞれのコントロールをフォームに貼り付けて、
次の手順のコードをForm_Loadに書けば、自由に線がマウスで書けますよ。

パフォーマンス的には軽いと思います。

編集 削除
hirobo-macros  2008-08-07 14:10:11  No: 100933  IP: 192.*.*.*

フォーム透過OCX Ver 2.00(KTrans32)
とMicrosoft Tablet PC Type Libraryを使用して

それぞれのコントロールをフォームに貼り付けて、
次の手順のコードをForm_Loadに書けば、自由に線がマウスで書けますよ。

パフォーマンス的には軽いと思います。

編集 削除
hirobo-macros  2008-08-07 14:59:52  No: 100934  IP: 192.*.*.*

すみません、送信ボタンをダブルクリックしてしましました。
削除できねーahh

とりあえず俺はこんな感じに作ってみました。
描いて(半透明状態)->ホイールクリック(透明状態)
メディアプレイヤー上で描けるかは不明です。

Option Explicit
Private Declare Function SetWindowPos _
                Lib "user32" (ByVal hWnd As Long, ByVal hWndInsertAfter As Long, _
                ByVal x As Long, ByVal y As Long, ByVal Cx As Long, _
                ByVal Cy As Long, ByVal wFlags As Long) As Long

Private Const conHwndTopmost = -1
Private Const conHwndNoTopmost = -2
Private mode_ As Boolean

Private Sub Form_Load()
SetWindowPos Me.hWnd, conHwndTopmost, _
                 Me.Left / Screen.TwipsPerPixelX, _
                 Me.Top / Screen.TwipsPerPixelY, _
                 Me.Width / Screen.TwipsPerPixelX, _
                 Me.Height / Screen.TwipsPerPixelY, 0
Me.Top = 0
Me.Left = 0
KTrans1.LayeredFlag = 1
KTrans1.TransMode = 4
End Sub

Private Sub InkPicture1_MouseDown(ByVal Button As MSINKAUTLibCtl.InkMouseButton, ByVal Shift As MSINKAUTLibCtl.InkShiftKeyModifierFlags, ByVal pX As Long, ByVal pY As Long, Cancel As Boolean)
If Button = IMF_Middle Then
    If mode_ = False Then
        KTrans1.LayeredFlag = 0
        KTrans1.TransMode = 4
        mode_ = True
    Else
        KTrans1.LayeredFlag = 1
        KTrans1.TransMode = 4
        mode_ = False
    End If
End If
If Button = IMF_Right Then
    End
End If
End Sub

Private Sub InkPicture1_MouseWheel(ByVal Button As MSINKAUTLibCtl.InkMouseButton, ByVal Shift As MSINKAUTLibCtl.InkShiftKeyModifierFlags, ByVal Delta As Long, ByVal x As Long, ByVal y As Long, Cancel As Boolean)
If Button = IMF_Middle Then
    KTrans1.LayeredAlpha = KTrans1.LayeredAlpha + Delta
End If
End Sub

Private Sub InkPicture1_Stroke(ByVal Cursor As MSINKAUTLibCtl.IInkCursor, ByVal Stroke As MSINKAUTLibCtl.IInkStrokeDisp, Cancel As Boolean)
KTrans1.LayeredFlag = 1
KTrans1.TransMode = 4
End Sub

編集 削除
YAS  2008-08-27 23:08:23  No: 100935  IP: 192.*.*.*

遅レスですみません。
見た目でよいのなら,デスクトップのデバイスコンテキストを取得し,
デスクトップにGDIで直接描画すればできると思います。

編集 削除