Page 1 of 1

MouseEnter event

Posted: Mon Oct 18, 2010 7:15 am
by 13052926
Hi

On my chart I have a line series representing share prices over time. I add a second series of points representing events (such as financial results released for example).

The points plot on the price line.

As the whole chart is dynamically created/modified by user I have procedures to add series as necessary. In those procedures I add handlers for the MouseEnter and MouseLeave events. The events fire correctly and call my own event handling procedures, however;

When the mouse pointer enters a point drawn on top of the line, the MouseEnter event returns the underlying line series, not the point series as expected.

Is there some way to resolve this?

I am working in VB.NET (2005) with version 3.5.3630.19311 of the control.

Re: MouseEnter event

Posted: Mon Oct 18, 2010 11:31 am
by 10050769
Hello rossmc,

Could you please send us a simple project, because we can reproduce your problem exactly here and try to find a solution for you?

Thanks,

Re: MouseEnter event

Posted: Mon Oct 18, 2010 12:36 pm
by 13052926
Here we go, very basic.

1) Run app and click on Add Line button. Mouse over line and form caption changes to 'LineTag'.

2) Click on Add Point (Offset). A point is added. Mousing over point changes caption to 'PointTagGreen'.

3) Click on Add Point. A point is added over the line. Mousing over this point invokes the handler for the line beneath it?

Re: MouseEnter event

Posted: Mon Oct 18, 2010 3:47 pm
by 10050769
Hello rossmc,
3) Click on Add Point. A point is added over the line. Mousing over this point invokes the handler for the line beneath it?
Thank you for your example. I could reproduce it here, but when I was tested your example I realized that MouseEnter works for all the series and tags show. So I think what happens is that when there are many series in same point, MouseEnter happens for each series, but only is showed the tag of the last series where the MouseEnter Event has entered, because are overwritten. I have modified your code, because you can see it:

Code: Select all

Imports Steema.TeeChart
Public Class Form1
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        TChart1.Series.RemoveAllSeries()
        Dim l As New Styles.Line(TChart1.Chart)
        With l
            'Title and Key (we store the key in the line tag so we can - in code - relate the chart line with the object that represents it in the mytdo.
            .Title = "A Line"
            .Tag = "LineTag"
            'Pen colour, width and style
            .Color = Color.Blue
            .LinePen.Width = 1
            .LinePen.Style = Drawing2D.DashStyle.Solid
            'Axes properties
            .HorizAxis = Styles.HorizontalAxis.Bottom
            .VertAxis = Styles.VerticalAxis.Left
            'Visible cursor on mouse over
            .Cursor = Cursors.Hand
            'Line events
            AddHandler .MouseEnter, AddressOf series_MouseEnter
            'Data
            For point As Integer = 0 To 10
                .Add(point, 2)
            Next
        End With
        TChart1.Axes.Bottom.SetMinMax(0, 10)
    End Sub
    Private Sub series1_MouseEnter(ByVal sender As Object, ByVal e As System.EventArgs)
        ListBox1.Items.Add(DirectCast(sender, Steema.TeeChart.Styles.Series).Tag.ToString)
    End Sub
    Private Sub series2_MouseEnter(ByVal sender As Object, ByVal e As System.EventArgs)
        ListBox1.Items.Add(DirectCast(sender, Steema.TeeChart.Styles.Series).Tag.ToString)
    End Sub
    Private Sub series_MouseEnter(ByVal sender As Object, ByVal e As System.EventArgs)
        ListBox1.Items.Add(DirectCast(sender, Steema.TeeChart.Styles.Series).Tag.ToString)
    End Sub
    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
        Dim s As New Styles.Points(TChart1.Chart)
        With s
            'UI
            .Title = "A Green Point"
            .Tag = "PointTagGreen"
            'Point format
            .Pointer.Style = Styles.PointerStyles.Circle
            .Pointer.Color = Color.Green
            .Pointer.VertSize = 5
            .Pointer.HorizSize = 5
            'Axes
            .HorizAxis = Styles.HorizontalAxis.Bottom
            .VertAxis = Styles.VerticalAxis.Left
            'Cursor type when over series
            .Cursor = Cursors.Hand
            .Add(3, 2)
            AddHandler .MouseEnter, AddressOf series1_MouseEnter
            'AddHandler .MouseLeave, AddressOf s1_MouseLeave
        End With
    End Sub
    Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
        Dim s As New Styles.Points(TChart1.Chart)
        With s
            'UI
            .Title = "A red Point"
            .Tag = "PointTagRed"
            'Point format
            .Pointer.Style = Styles.PointerStyles.Circle
            .Pointer.Color = Color.Red
            .Pointer.VertSize = 5
            .Pointer.HorizSize = 5
            'Axes
            .HorizAxis = Styles.HorizontalAxis.Bottom
            .VertAxis = Styles.VerticalAxis.Left
            'Cursor type when over series
            .Cursor = Cursors.Hand
            .Add(4, 2)
            AddHandler .MouseEnter, AddressOf series2_MouseEnter
        End With
    End Sub
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        TChart1.Aspect.View3D = False
    End Sub
End Class
On the other hand, could you please, explain us exactly what are you doing, because we can try to help you to find a good solution for it?

Thanks,

Re: MouseEnter event

Posted: Tue Oct 19, 2010 6:19 am
by 13052926
Thanks for reply. Even knowing that I don't think I can solve the problem.

I have a chart with many series representing very different data sets. For example a price line, and a point series representing news events. There could also be series representing various functions and overlays etc etc. For all of these different 'types' I need custom tooltips. Not just different text, but complex interactive tooltips with mixed text/images, sometimes listboxes, and more.

I can create my own tooltip windows and handle the required code, however, I need to know when the mouse enters a particular series, and which series it is, as accurately as possible. Hence the MouseEnter code I was trying, which works unless there are multiple series on the same point.

Since it is easy enough to track where (X,Y) co-ordinates the mouse pointer is at anytime, is there a way to determine what - if anything - is under the mouse pointer at a particular set of co-ordinates?

Another way to perhaps get this done is to use the markstip tool, but suppress it at the .GetText event so I can rather show my own tooltip window.

Many thanks

Re: MouseEnter event

Posted: Tue Oct 19, 2010 1:43 pm
by 10050769
Hello rossmc,

I suggested you two options that I think can help you solve your problem:

First: I think you can use Series Click event, for select series, but if there are two or more series in the same point you only can select the last series are you added.

Code: Select all

Imports Steema.TeeChart

Public Class Form1
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        TChart1.Series.RemoveAllSeries()

        Dim l As New Styles.Line(TChart1.Chart)

        With l
            'Title and Key (we store the key in the line tag so we can - in code - relate the chart line with the object that represents it in the mytdo.
            .Title = "A Line"
            .Tag = "LineTag"

            'Pen colour, width and style
            .Color = Color.Blue
            .LinePen.Width = 1
            .LinePen.Style = Drawing2D.DashStyle.Solid

            'Axes properties
            .HorizAxis = Styles.HorizontalAxis.Bottom
            .VertAxis = Styles.VerticalAxis.Left

            'Visible cursor on mouse over
            .Cursor = Cursors.Hand

            'Line events

            AddHandler .Click, AddressOf series_Click

            'Data
            For point As Integer = 0 To 10
                .Add(point, 2)
            Next

        End With

        'TChart1.Axes.Left.SetMinMax(2, 16)
        TChart1.Axes.Bottom.SetMinMax(0, 10)

    End Sub
    Private Sub series1_Click(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs)
        ListBox1.Items.Add(DirectCast(sender, Steema.TeeChart.Styles.Series).Tag.ToString)
    End Sub
    Private Sub series2_Click(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs)
        ListBox1.Items.Add(DirectCast(sender, Steema.TeeChart.Styles.Series).Tag.ToString)
    End Sub
    Private Sub series_Click(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs)
        ListBox1.Items.Add(DirectCast(sender, Steema.TeeChart.Styles.Series).Tag.ToString)
    End Sub

    Private Sub series_MouseLeave(ByVal sender As Object, ByVal e As System.EventArgs)
        'not important
    End Sub

    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click

        Dim s As New Styles.Points(TChart1.Chart)

        With s
            'UI
            .Title = "A Green Point"
            .Tag = "PointTagGreen"

            'Point format
            .Pointer.Style = Styles.PointerStyles.Circle
            .Pointer.Color = Color.Green
            .Pointer.VertSize = 5
            .Pointer.HorizSize = 5

            'Axes
            .HorizAxis = Styles.HorizontalAxis.Bottom
            .VertAxis = Styles.VerticalAxis.Left

            'Cursor type when over series
            .Cursor = Cursors.Hand

            .Add(4, 2)
            AddHandler .Click, AddressOf series1_Click
        End With

    End Sub
    Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
        Dim s As New Styles.Points(TChart1.Chart)
        With s
            'UI
            .Title = "A red Point"
            .Tag = "PointTagRed"

            'Point format
            .Pointer.Style = Styles.PointerStyles.Circle
            .Pointer.Color = Color.Red
            .Pointer.VertSize = 5
            .Pointer.HorizSize = 5

            'Axes
            .HorizAxis = Styles.HorizontalAxis.Bottom
            .VertAxis = Styles.VerticalAxis.Left

            'Cursor type when over series
            .Cursor = Cursors.Hand

            .Add(4, 2)
            AddHandler .Click, AddressOf series2_Click
        End With

    End Sub
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        TChart1.Aspect.View3D = False
    End Sub
Second: I think this is the best solution for you. In this case you work using MouseMoveEvent and method Clicked of series as do in next code:

Code: Select all

Imports Steema.TeeChart

Public Class Form1
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        TChart1.Series.RemoveAllSeries()

        Dim l As New Styles.Line(TChart1.Chart)

        With l
            'Title and Key (we store the key in the line tag so we can - in code - relate the chart line with the object that represents it in the mytdo.
            .Title = "A Line"
            .Tag = "LineTag"

            'Pen colour, width and style
            .Color = Color.Blue
            .LinePen.Width = 1
            .LinePen.Style = Drawing2D.DashStyle.Solid

            'Axes properties
            .HorizAxis = Styles.HorizontalAxis.Bottom
            .VertAxis = Styles.VerticalAxis.Left

            'Visible cursor on mouse over
            .Cursor = Cursors.Hand

            'Line events
            'Data
            For point As Integer = 0 To 10
                .Add(point, 2)
            Next

        End With

        'TChart1.Axes.Left.SetMinMax(2, 16)
        TChart1.Axes.Bottom.SetMinMax(0, 10)

    End Sub
    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click

        Dim s As New Styles.Points(TChart1.Chart)

        With s
            'UI
            .Title = "A Green Point"
            .Tag = "PointTagGreen"

            'Point format
            .Pointer.Style = Styles.PointerStyles.Circle
            .Pointer.Color = Color.Green
            .Pointer.VertSize = 5
            .Pointer.HorizSize = 5

            'Axes
            .HorizAxis = Styles.HorizontalAxis.Bottom
            .VertAxis = Styles.VerticalAxis.Left

            'Cursor type when over series
            .Cursor = Cursors.Hand

            .Add(4, 2)
        End With

    End Sub
    Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
        Dim s As New Styles.Points(TChart1.Chart)
        With s
            'UI
            .Title = "A red Point"
            .Tag = "PointTagRed"

            'Point format
            .Pointer.Style = Styles.PointerStyles.Circle
            .Pointer.Color = Color.Red
            .Pointer.VertSize = 5
            .Pointer.HorizSize = 5

            'Axes
            .HorizAxis = Styles.HorizontalAxis.Bottom
            .VertAxis = Styles.VerticalAxis.Left

            'Cursor type when over series
            .Cursor = Cursors.Hand

            .Add(4, 2)
        End With
    End Sub
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        TChart1.Aspect.View3D = False
        AddHandler TChart1.MouseMove, AddressOf TChart1_MouseMove
    End Sub
    Private Sub TChart1_MouseMove(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs)
        Dim i As Integer
        For i = 0 To TChart1.Series.Count - 1
            If (Not TChart1(i).Clicked(e.X, e.Y) = -1) Then
                ListBox1.Items.Add(DirectCast(TChart1(i), Steema.TeeChart.Styles.Series).Tag.ToString)
            End If
        Next
    End Sub
End Class
In this example you need decided which criteria are you would use for selected the series, you want to be the last to be selected, because should decide whether the loop is ascendant or descendant.

I hope will helps.

Thanks,

Re: MouseEnter event

Posted: Wed Oct 20, 2010 8:26 am
by 13052926
Thanks for the help Sandra. I am going to try option two as ideally I would like to know exactly how many, and what type, of series are under a particular point (if multiple).

I already started a little bit of a hack for this by still using just the mouseenter event, but loading the series keys into an array and then processing the array from 0 to array.length. On mouseleave event I then clear the array.

I'll post my solution in the event anyone else is interested.