我知道這是一個非常受歡迎的問題,但是我找到的解決方案都不適合我。如何在MouseMove事件期間停止閃爍控制
背景:我有一個VS2015中的窗體項目,它從文本文件中讀取數據,並在折線圖上繪製多個系列的數據。 Chart.MouseMove事件查找最接近鼠標的點並在其周圍繪製一個圓圈。圓圈繪製在Chart_Paint事件
Private Sub crtLogView(sender As Object,e As PaintEventArgs) Handles crtLogView.Paint
Dim whitePen as New Pne(Color.White,2)
e.Graphics.DrawEllipse(whitePen,cir) '//cir is a Public Rectangle
End Sub
當移動跨越圖表鼠標,隨機控制閃爍,然後重新開啓這是很煩人的。我已經發布了下面的MouseMove事件代碼。
潛在的解決方案我曾嘗試:
- 打開的窗體DoubleBuffered屬性,它什麼都不做
- 使用Me.Invalidate()和Me.Update()方法,它不動圓
- 使用Chart.Invalidate()和Chart.Update()方法,它的工作原理,但速度很慢
- 添加以下代碼,以我的Form_Load例程,它顯得無能爲力
任何幫助,將不勝感激
Me.SetStyle(ControlStyles.AllPaintingInWmPaint, True)
Me.SetStyle(ControlStyles.DoubleBuffer, True)
Me.SetStyle(ControlStyles.UserPaint, True)
MouseMove事件代碼:
Private Sub crtLogView_MouseMove(sender As Object, e As MouseEventArgs) Handles crtLogView.MouseMove
'//Show data for closest point to cursor & draw circle around point
Dim hResult As HitTestResult = crtLogView.HitTest(e.X, e.Y)
Dim srsNam As String = ""
Dim mouseY As Single
Dim pntDist As Double = 0
Dim pntX As Single
Dim pntY As Single
Dim mouseX As Single
On Error GoTo ErrTrap
'//Get X-Axis Position as integer
mouseX = Int(hResult.ChartArea.AxisX.PixelPositionToValue(e.X))
'// Set time value
lblTime.Text = String.Format("{0:n2}", hResult.ChartArea.AxisX.PixelPositionToValue(e.X)/160)
'//Get Y-Axis Position
mouseY = hResult.ChartArea.AxisY.PixelPositionToValue(e.Y)
'//Get distance from mouse to point on Series(0)
pntDist = Math.Abs(crtLogView.Series(0).Points(mouseX).YValues(0) - mouseY)
srsNam = crtLogView.Series(0).Name '//1st series name
'//Find closest series
For i As Integer = 1 To crtLogView.Series.Count - 1
If Math.Abs(crtLogView.Series(i).Points(mouseX).YValues(0) - mouseY) < pntDist Then
pntDist = Math.Abs(crtLogView.Series(i).Points(mouseX).YValues(0) - mouseY)
srsNam = crtLogView.Series(i).Name
End If
Next
'//Set Top/Left values for circle
pntY = crtLogView.ChartAreas(0).AxisY.ValueToPixelPosition(crtLogView.Series(srsNam).Points(mouseX).YValues(0)) - 4
pntX = crtLogView.ChartAreas(0).AxisX.ValueToPixelPosition(Val(mouseX)) - 4
'//Move circle to closest point
cir.Location = New Point(pntX, pntY)
'//Refresh the form to move the circle
'//This works, but takes 2+ seconds to take effect
'crtLogView.Invalidate()
'crtLogView.Update()
'//This does not work
'Me.Invalidate()
'Me.Update()
'//This works, but randomly makes other controls flash/flicker
Me.Refresh()
ErrTrap:
End Sub
我不知道你爲什麼使用mousemove事件 - 它會一直在燒。您是否嘗試在鼠標移動時重置計時器,然後在停止時繪製圓圈? – peterG
您可能更適合使用圖表註釋或數據點標籤來代替執行自定義繪畫。如果你需要一個例子,我可以提供一個例子。 – TnTinMn
@peterG感謝您的建議!我沒有試過一個計時器,但現在,它只會使閃爍稍不頻繁 – JerryT