2008-11-21 15 views
5

Ich muss ein Steuerelement erstellen, das nur einen Umriss zeigt, und ich muss es über ein Steuerelement platzieren, das ein Video zeigt. Wenn ich meine Steuerung transparent mache, ist das Video verdeckt, weil transparente Steuerelemente von ihrer übergeordneten Steuerung gezeichnet werden und das Video nicht vom Steuerelement gezeichnet wird. Es wird mit DirectShow oder einer anderen Bibliothek angezeigt. Stattdessen zeichnet das übergeordnete Steuerelement seine BackColor.Wie mache ich eine wirklich transparente Kontrolle?

Also - kann ich ein Steuerelement machen, das nicht überhaupt lackiert wird, außer wo es undurchsichtig ist? Auf diese Weise würde die Elternkontrolle das Video nicht übermalen.

Ich weiß, ich könnte die Grenze aus vier Steuerelementen (oder mehr, wenn ich es gestrichelt wollen) machen, aber ist es möglich, was ich will mit nur einem Steuerelement?


rslite stimmt - auch wenn Sie brauchen noch nicht einmal so weit zu gehen, wie PInvoke wie sein Beispiel zu verwenden, tut - die Control.Region Eigenschaft völlig ausreichend ist.

Antwort

4

Sie könnten versuchen, eine Region mit einem Loch zu erstellen und die Kontrollregion mit SetWindowRgn festzulegen.

Hier ist ein example (ich konnte keinen besseren finden). Die Idee besteht darin, zwei Regionen zu erzeugen und die innere von der äußeren zu subtrahieren. Ich denke, das sollte dir geben, was du brauchst.

-1

Sie könnten versuchen, die Form.TransparencyKey Eigenschaft zu setzen. Andernfalls könnten Sie DirectX verwenden, um auf den Framebuffer zuzugreifen und direkt darauf zu zeichnen.

+0

Ich habe die Frage falsch gelesen. Obwohl Formulare transparent gemacht werden können und Videos durch sie angezeigt werden, ist es viel schwieriger, dasselbe mit einem Steuerelement-/untergeordneten Formular zu tun, und die Steuerelemente unter der transparenten Steuerung müssen die Paint-Ereignisse bei ihrer Aktualisierung erhöhen. – Skizz

0

Ich verwende eine übergeordnete Funktion für das von der Klassensteuerung.

  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 Steuer

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

    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 deaktivieren Sie können diese Klasse erweitern, um Ihre eigene Kontrolle zu erhalten. Nach dem Debuggen erscheint die Klasse in der Toolbox.

Hoffe, das macht den Trick.

Verwandte Themen