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,

War es hilfreich?

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.

  1. Die createparams Eigenschaft zeigt nun, dass die Steuerung transparent sein kann.

  2. InvalidateEx ist notwendig, um die Eltern Region ungültig zu machen, wo die Kontrolle gestellt wird

  3. Sie haben die automatische Farbe der Hintergrundfarbe von der Steuerung ( ')

    deaktivieren
    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
    

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top