本当に透明なコントロールを作成するにはどうすればよいですか?
-
08-07-2019 - |
質問
アウトラインのみを表示するコントロールを作成し、ビデオを表示しているコントロールの上に配置する必要があります。コントロールを透明にすると、透明なコントロールは親コントロールによって描画され、ビデオはコントロールによって描画されないため、ビデオは見えなくなります。 DirectShowまたは別のライブラリを使用して表示されるため、代わりに親コントロールがBackColorをペイントします。
だから-不透明である場合を除き、ペイントされないコントロールを作成できますか?そうすれば、親コントロールはビデオを塗りつぶしません。
4つのコントロール(または破線が必要な場合はそれ以上)から境界線を作成できることはわかっていますが、1つのコントロールだけを使用して目的の操作を実行できますか?
rsliteは正しいです-彼の例のようにPInvokeを使用するために行く必要さえありませんが、Control.Regionプロパティで十分です。
解決
内部に穴のある領域を作成し、SetWindowRgnを使用して制御領域を設定しようとすることができます。
例(できませんでしたより良いものを見つけられない)。 2つの領域を作成し、外側の領域から内側の領域を減算するという考え方です。これで必要なものが得られると思います。
他のヒント
クラスコントロールのオーバーライド関数を使用します。
-
createparams
プロパティは、コントロールを透明にできることを示しています。 -
InvalidateEx
は、コントロールが配置されている親の領域を無効にするために必要です -
コントロールからのバックカラーの自動ペイントを無効にする必要があります( ')
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を使用してフレームバッファーにアクセスし、直接描画できます。