关于窗体控件刷新的问题,百思不得其解,请高手帮忙
我有一个WinForm窗体,比如设置了蓝色的背景色,该窗体上有一个Panel,颜色为透明,但是为该Panel设置了一个背景图片;在该Panel里面有一些Label,每个Label的背景色也都为透明;
现在的一个问题是,当窗体在进行切换并刷新时,会明显看到每个Label会先在其自己的区域里绘制为窗体的背景色,经过一小段时间后,才显示为透明,并显示Label的文本。有没有什么办法,可以阻止Label绘制那个区域,而直接显示文本,即阻止那个闪烁的过程。
我试过以下方法:
1)采用双缓冲技术:
SetStyle(ControlStyles.UserPaint, True)
SetStyle(ControlStyles.AllPaintingInWmPaint, True) '禁止擦除背景.
SetStyle(ControlStyles.DoubleBuffer, True) ' 双缓冲
UpdateStyles()
2)重写OnPaintBackground函数,让该函数留空。
但是都不能达到我想要的效果,不知各位高手有没有遇到过这方面的问题,有没有什么好的经验,不胜感激!!!
[解决办法]
设置control.DoubleBuffered 属性(保护的,继承一下),这里即label
[解决办法]
1。你为哪个控件设置了双缓冲?
2。你在哪个控件里写了 OnPaintBackground方法?
[解决办法]
把label的parent属性设置为Panel
[解决办法]
双缓冲也不避免的要晃动的,.Net特性决定了闪动的存在。
[解决办法]
Imports System
Imports System.Drawing
Imports System.Windows.Forms
Namespace TranspControl
Public Class TranspControl
Inherits Control
' Methods
Public Sub New()
AddHandler Me.delay.Tick, New EventHandler(AddressOf Me.TimerOnTick)
Me.delay.Enabled = True
Me.delay.Interval = 50
End Sub
Protected Overrides Sub OnMove(ByVal e As EventArgs)
MyBase.RecreateHandle
End Sub
Protected Overrides Sub OnPaint(ByVal e As PaintEventArgs)
Dim alpha As Integer
Dim graphics As Graphics = e.Graphics
Dim rect As New Rectangle(0, 0, (MyBase.Width - 1), (MyBase.Height - 1))
Dim baseColor As Color = Me.brushColor
If (baseColor = Color.Transparent) Then
alpha = 0
Else
alpha = ((Me.opacity * &HFF) / 100)
End If
Dim pen As New Pen(Color.Black)
Dim brush As New SolidBrush(Color.FromArgb(alpha, baseColor))
graphics.FillEllipse(brush, rect)
graphics.DrawEllipse(pen, rect)
pen.Dispose
brush.Dispose
graphics.Dispose
End Sub
Protected Overrides Sub OnPaintBackground(ByVal e As PaintEventArgs)
End Sub
Private Sub TimerOnTick(ByVal source As Object, ByVal e As EventArgs)
MyBase.RecreateHandle
Me.delay.Stop
End Sub
' Properties
Public Property BrushColor As Color
Get
Return Me.brushColor
End Get
Set(ByVal value As Color)
Me.brushColor = value
MyBase.RecreateHandle
End Set
End Property
Protected Overrides ReadOnly Property CreateParams As CreateParams
Get
Dim createParams As CreateParams = MyBase.CreateParams
createParams.ExStyle = (createParams.ExStyle Or &H20)
Return createParams
End Get
End Property
Public Property Opacity As Integer
Get
If (Me.opacity > 100) Then
Me.opacity = 100
ElseIf (Me.opacity < 0) Then
Me.opacity = 0
End If
Return Me.opacity
End Get
Set(ByVal value As Integer)
Me.opacity = value
MyBase.RecreateHandle
End Set
End Property
' Fields
Private brushColor As Color = Color.Transparent
Private delay As Timer = New Timer
Private opacity As Integer = 100
End Class
End Namespace
这个是强制控件透明的例子,你可以参考以下。不过要说绝对不闪动,似乎很难