Wie kann ich eine wirklich transparente Steuerung machen?
-
08-07-2019 - |
Frage
Ich brauche eine Steuerung zu machen, die nur einen Umriss zeigt, und ich brauche es über eine Kontrolle zu stellen, die ein Video ist zeigt. Wenn ich meine Kontrolle transparent zu machen, dann ist das Video verdeckt, weil transparente Kontrollen durch ihre Eltern Kontrolle gemalt werden und das Video wird von der Steuerung nicht gemalt; ist es mit Directshow oder eine andere Bibliothek gezeigt, so dass anstelle der übergeordnete Steuer malt seine Backcolor.
So - kann ich eine Kontrolle, die nicht gemalt bekommen bei allen , es sei denn, es ist undurchsichtig? Auf diese Weise würde die übergeordnete Steuerung das Video nicht übermalen.
Ich weiß, ich könnte die Grenze von vier Kontrollen machen (oder mehr, wenn ich es gestrichelte will), aber ist es möglich, zu tun, was ich mit möge nur eine Kontrolle?
rslite stimmt - auch wenn Sie brauchen noch nicht einmal so weit zu gehen, wie PInvoke zu verwenden wie sein Beispiel tut -. Die Control.Region Eigenschaft völlig ausreichend ist,
Lösung
Sie könnten versuchen, eine Region mit einem Loch im Innern zu machen und die Kontrollregion mit SetWindowRgn eingestellt.
Hier ist ein Beispiel (I couldn ‚t finden ein besseres). Die Idee ist, zwei Bereiche zu erzeugen, und die inneren von den äußeren einen subtrahieren. Ich denke, dass sollten Sie geben, was Sie brauchen.
Andere Tipps
Ich verwende eine überschriebene Funktion für den aus der Klasse Kontrolle.
-
Die
createparams
Eigenschaft zeigt nun, dass die Steuerung transparent sein kann. -
InvalidateEx
ist notwendig, um die Eltern Region ungültig zu machen, wo die Kontrolle gestellt wird -
Sie haben die automatische Farbe der Hintergrundfarbe von der Steuerung ( ')
deaktivierenImports 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
Sie können diese Klasse erweitern, um Ihre eigene Kontrolle zu machen. Nach dem Debuggen der Klasse wird in der Toolbox angezeigt.
Hope dies funktioniert der Trick.
Sie könnten versuchen, die Einstellung Form.TransparencyKey
Eigenschaft. Gelingt das nicht, könnten Sie DirectX verwenden, um Zugriff auf den Rahmenpuffer zu erhalten und direkt auf sie ziehen.