本当に透明なコントロールを作成するにはどうすればよいですか?

StackOverflow https://stackoverflow.com/questions/308667

  •  08-07-2019
  •  | 
  •  

質問

アウトラインのみを表示するコントロールを作成し、ビデオを表示しているコントロールの上に配置する必要があります。コントロールを透明にすると、透明なコントロールは親コントロールによって描画され、ビデオはコントロールによって描画されないため、ビデオは見えなくなります。 DirectShowまたは別のライブラリを使用して表示されるため、代わりに親コントロールがBackColorをペイントします。

だから-不透明である場合を除き、ペイントされないコントロールを作成できますか?そうすれば、親コントロールはビデオを塗りつぶしません。

4つのコントロール(または破線が必要な場合はそれ以上)から境界線を作成できることはわかっていますが、1つのコントロールだけを使用して目的の操作を実行できますか?


rsliteは正しいです-彼の例のようにPInvokeを使用するために行く必要さえありませんが、Control.Regionプロパティで十分です。

役に立ちましたか?

解決

内部に穴のある領域を作成し、SetWindowRgnを使用して制御領域を設定しようとすることができます。

(できませんでしたより良いものを見つけられない)。 2つの領域を作成し、外側の領域から内側の領域を減算するという考え方です。これで必要なものが得られると思います。

他のヒント

クラスコントロールのオーバーライド関数を使用します。

  1. createparams プロパティは、コントロールを透明にできることを示しています。

  2. InvalidateEx は、コントロールが配置されている親の領域を無効にするために必要です

  3. コントロールからのバックカラーの自動ペイントを無効にする必要があります( ')

    Imports System.Windows.Forms.Design
    Imports System.Reflection
        Public Class TransparentControl : Inherits Control
            Protected Overrides ReadOnly Property CreateParams As CreateParams
                Get
                    Dim cp As CreateParams = MyBase.CreateParams()
                    cp.ExStyle = cp.ExStyle Or 32 'WS_EX_TRANSPARENT
                    Return cp
                End Get
             End Property
            Protected Sub InvalidateEx(rct As Rectangle)
                Me.Invalidate(rct)
                If IsNothing(Parent) Then Exit Sub
                Parent.Invalidate(New Rectangle(Me.Location, rct.Size), True)
            End Sub
            Protected Sub InvalidateEx()
                Me.Invalidate()
                 If IsNothing(Parent) Then Exit Sub
                 Parent.Invalidate(New Rectangle(Me.Location, Me.Size), True)
            End Sub
            Protected Overrides Sub OnPaintBackground(pevent As PaintEventArgs)
                'MyBase.OnPaintBackground(pevent)
            End Sub
    
            Protected Overrides Sub OnPaint(e As PaintEventArgs)
                 MyBase.OnPaint(e)
                'draw the layout on e.Graphics
            End Sub
        End Class
    

このクラスを拡張して、独自のコントロールを作成できます。デバッグ後、ツールボックスにクラスが表示されます。

これでうまくいくと思います。

Form.TransparencyKey プロパティ。それに失敗すると、DirectXを使用してフレームバッファーにアクセスし、直接描画できます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top