【发布时间】:2009-02-04 13:22:21
【问题描述】:
我正在用漂亮的渐变填充填充一些 VB.NET 2005 WinForms 表单的背景(通过覆盖 OnPaint 事件)。这很好用,但即使在我将 BackColor 设置为 Color.Transparent 之后,表单上的各种标签等也会以纯色背景显示。设置表单本身的透明度键似乎会影响这一点,但我无法让标签具有真正透明的背景色,是否有一种简单的方法可以解决这个问题,或者我是否正在查看自定义控件等?
【问题讨论】:
我正在用漂亮的渐变填充填充一些 VB.NET 2005 WinForms 表单的背景(通过覆盖 OnPaint 事件)。这很好用,但即使在我将 BackColor 设置为 Color.Transparent 之后,表单上的各种标签等也会以纯色背景显示。设置表单本身的透明度键似乎会影响这一点,但我无法让标签具有真正透明的背景色,是否有一种简单的方法可以解决这个问题,或者我是否正在查看自定义控件等?
【问题讨论】:
向您的项目添加一个新类并粘贴如下所示的代码。建造。将新控件从工具箱顶部拖放到表单上。
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
闪烁可能很明显,无法修复。
【讨论】:
经过一些实验,我发现以下方法适用于渐变填充表单背景和保持标签透明度:
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)
【讨论】: