如何制作真正透明的控件?

时间:2008-11-21 12:56:23

标签: c# winforms transparency

我需要创建一个仅显示轮廓的控件,我需要将它放在显示视频的控件上。如果我使我的控件透明,那么视频会被遮挡,因为透明控件是由其父控件绘制的,而视频不是由控件绘制的;它使用DirectShow或其他库显示,因此父控件将其描绘为BackColor。

那么 - 我可以制作一个没有被绘制的控件,除非它是不透明的吗?这样,父控件就不会对视频进行绘制。

我知道我可以用四个控件制作边框(或者如果我想要它更多的话,可以更多)但是可以使用一个控件做我想要的操作吗?


rslite是对的 - 尽管你甚至不需要像他的例子一样使用PInvoke - Control.Region属性就足够了。

3 个答案:

答案 0 :(得分:4)

您可以尝试在其中创建一个带有洞的区域,并使用SetWindowRgn设置控制区域。

这是一个example(我找不到更好的一个)。想法是创建两个区域并从外部区域中减去内部区域。我认为应该给你你需要的东西。

答案 1 :(得分:0)

我在类控件中使用了重写函数。

  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
    
  4. 您可以扩展此类以进行自己的控制。调试后,该类将出现在工具箱中。

    希望这可以解决问题。

答案 2 :(得分:-1)

您可以尝试设置Form.TransparencyKey属性。如果做不到这一点,你可以使用DirectX来访问帧缓冲区并直接绘制它。