快要在这里失去理智了。我已经在谷歌上搜索了一个小时,试图解决这个轻微但令人难以置信的严重问题。
我的TabControl
表格上有两个标签。每个选项卡都有一个 16x16 的图标和一些文本。这里没有什么疯狂的事情。
在某些情况下,我需要让其中一个选项卡图标闪烁。所以我创建了两个图像,并将它们添加ImageList
到TabControl
. 我设置了一个背景计时器,它在两个图像之间切换以模拟闪烁的图标。工作正常。
但是,它会导致所有选项卡标题重新绘制,从而使它们闪烁。
TabControl
无论您尝试做什么,都不支持双缓冲。
我发现人们使用以下代码成功地驯服了闪烁:
Protected Overrides ReadOnly Property CreateParams() As CreateParams
Get
Dim cp As CreateParams = MyBase.CreateParams
cp.ExStyle = cp.ExStyle Or &H2000000
Return cp
End Get
End Property
这很有效,因为它不会闪烁......但图标也不会在视觉上发生变化,除非鼠标光标悬停在导致重绘的东西上。
有没有人有任何可能有效的替代解决方案或技巧?这实际上是该软件的一个非常重要的功能。
骨架代码:
Public Class Form1
Dim BlinkTimer As Windows.Forms.Timer
Dim BlinkToggler As Boolean = False
Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
InitBlinker()
End Sub
Private Sub InitBlinker()
BlinkTimer = New Windows.Forms.Timer
AddHandler BlinkTimer.Tick, AddressOf Blinker_Tick
With BlinkTimer
.Enabled = True
.Interval = 250
End With
StartBlinker()
End Sub
Public Sub StartBlinker()
SomeTabPage.ImageKey = "light_off.png"
BlinkToggler = False
BlinkTimer.Start()
End Sub
Public Sub StopBlinker()
SomeTabPage.ImageKey = "light_off.png"
BlinkToggler = False
BlinkTimer.Stop()
End Sub
Private Sub Blinker_Tick()
If BlinkToggler Then
SomeTabPage.ImageKey = "light_on.png"
Else
SomeTabPage.ImageKey = "light_off.png"
End If
BlinkToggler = Not BlinkToggler
End Sub
End Class