5

我需要制作一个只显示轮廓的控件,并且我需要将它放在显示视频的控件上。如果我让我的控件透明,那么视频就会被遮挡,因为透明控件是由它们的父控件绘制的,而视频不是由控件绘制的;它使用 DirectShow 或其他库显示,因此父控件绘制其背景色。

那么 - 我可以制作一个根本不被绘制的控件除非它是不透明的?这样,父控件就不会在视频上绘制。

我知道我可以用四个控件制作边框(如果我想要虚线,可以制作更多),但是是否可以只使用一个控件来做我想做的事情?


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

4

3 回答 3

4

您可以尝试制作一个内部有孔的区域,并使用 SetWindowRgn 设置控制区域。

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

于 2008-11-21T13:03:36.917 回答
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
    

您可以扩展此类以进行自己的控制。调试后该类将出现在工具箱中。

希望这能解决问题。

于 2013-12-30T23:24:51.873 回答
-1

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

于 2008-11-21T13:12:39.957 回答