【问题标题】:Transparent control backgrounds on a VB.NET gradient filled form?VB.NET渐变填充表单上的透明控件背景?
【发布时间】:2009-02-04 13:22:21
【问题描述】:

我正在用漂亮的渐变填充填充一些 VB.NET 2005 WinForms 表单的背景(通过覆盖 OnPaint 事件)。这很好用,但即使在我将 BackColor 设置为 Color.Transparent 之后,表单上的各种标签等也会以纯色背景显示。设置表单本身的透明度键似乎会影响这一点,但我无法让标签具有真正透明的背景色,是否有一种简单的方法可以解决这个问题,或者我是否正在查看自定义控件等?

【问题讨论】:

    标签: vb.net winforms


    【解决方案1】:

    向您的项目添加一个新类并粘贴如下所示的代码。建造。将新控件从工具箱顶部拖放到表单上。

    Public Class TransparentLabel
        Inherits Label
    
        Public Sub New()
            Me.SetStyle(ControlStyles.Opaque, True)
            Me.SetStyle(ControlStyles.OptimizedDoubleBuffer, False)
        End Sub
    
        Protected Overrides ReadOnly Property CreateParams() As System.Windows.Forms.CreateParams
            Get
                Dim cp As CreateParams = MyBase.CreateParams
                cp.ExStyle = cp.ExStyle Or &H20  ' Turn on WS_EX_TRANSPARENT
                Return cp
            End Get
        End Property
    End Class
    

    闪烁可能很明显,无法修复。

    【讨论】:

      【解决方案2】:

      经过一些实验,我发现以下方法适用于渐变填充表单背景和保持标签透明度:

      Protected Overrides Sub OnPaint(ByVal e As System.Windows.Forms.PaintEventArgs)
      
          Dim formGraphics As Graphics = e.Graphics
          Dim gradientBrush As New LinearGradientBrush(New Point(0, Height), New Point(0, 0), Me.AppSettings.FormGradiantFrom, Me.AppSettings.FormGradiantTo)
      
          formGraphics.FillRectangle(gradientBrush, ClientRectangle)
      
      End Sub
      

      并在表单加载事件中:

      SetStyle(ControlStyles.AllPaintingInWmPaint Or ControlStyles.DoubleBuffer Or _
                     ControlStyles.ResizeRedraw Or ControlStyles.UserPaint, True)
      

      【讨论】:

      • 我实现了描述的解决方案,但我遇到了一个问题:当我拖动我的表单时,它在先前位置捕获的背景被拖动到新位置...
      猜你喜欢
      • 1970-01-01
      • 2015-06-15
      • 2011-07-26
      • 1970-01-01
      • 2013-03-22
      • 1970-01-01
      • 2011-08-06
      • 2011-12-05
      • 1970-01-01
      相关资源
      最近更新 更多