Hola Jordi,
Primero un par de consideraciones que te agradeceriamos que tuvieras en cuenta, por la comodidad de todos.
-Por favor, publica las respuestas referentes al mismo problema como "reply" dentro del mismo hilo del foro. Abrir diferentes hilos para una misma pregunta no nos ayuda a ver el progreso del tema.
-Intenta escribir utilizando menos las mayúsculas. Como ya debes saber, se consideran gritos. Y no creemos, ni nos gustaria, haberte hecho enfadar...
Bueno, al tema. Si he entendido bien, en tu gráfico, deseas que, haciendo click sobre él, te aparezca una linea que vaya a un texto donde ponga "Soporte Y" (siendo Y el valor correspondiente al eje). Y deseas que al hacer Scroll con el botón derecho del mouse, todo se mueva.
Bien, dices que has dibujado la linea y que ahora tienes problemas con el texto. Pues yo te sugeriria que utilizaras la Annotation Tool que creo que seria la herramienta más acorde a lo que (creo) intentas hacer.
Aqui te pongo el ejemplo de cómo lo haria yo. Calculo la posicion de las annotations haciendo la diferencia entre las X anteriores y las que tiene el mouse en cada momento y de la misma forma con las Y. Es decir, que en OnMouseDown me guardo la posicion "vieja" y en OnMouseMove guardo la posicion "nueva" y la diferencia entre ambas será lo que habrá que mover cada annotation. Ten en cuenta que ésta forma de calcular no funcionaria bien al hacer zoom o unzoom, y por eso lo desactivo. Porque utilizar el desplazamiento del mouse como referencia, no seria la forma de atacar el problema si quisieras utilizar el zoom. Para ello, deberias guardar la posicion de cada annotation respecto a los ejes en una variable para cada eje y annotation, con lo que el gasto extra de memória seria proporcional al numero de annotations que permitas.
Code: Select all
Dim XDown, YDown, XActual, YActual As Double
Private Sub Form_Load()
With TChart1
.Aspect.View3D = False
.Zoom.Enable = False
.AddSeries scCandle
.Series(0).FillSampleValues 10
.Legend.Visible = False
End With
End Sub
Private Sub TChart1_OnMouseDown(ByVal Button As TeeChart.EMouseButton, ByVal Shift As TeeChart.EShiftState, ByVal X As Long, ByVal Y As Long)
XDown = X
YDown = Y
End Sub
Private Sub TChart1_OnMouseMove(ByVal Shift As TeeChart.EShiftState, ByVal X As Long, ByVal Y As Long)
XActual = X
YActual = Y
End Sub
Private Sub TChart1_OnMouseUp(ByVal Button As TeeChart.EMouseButton, ByVal Shift As TeeChart.EShiftState, ByVal X As Long, ByVal Y As Long)
If XDown = X And YDown = Y Then
If Button = mbLeft Then
With TChart1.Tools
.Add tcAnnotate
With .Items(.Count - 1).asAnnotation
.Callout.Arrow.Visible = True
.Callout.Arrow.Color = vbBlack
.Callout.XPosition = X
.Callout.YPosition = Y
.Left = X - 200
.Top = Y - ((.Bounds.Bottom - .Bounds.Top) / 2)
.Text = "Soporte " + Str$(FormatNumber(TChart1.Axis.Left.CalcPosPoint(Y), 2))
End With
End With
End If
End If
End Sub
Private Sub TChart1_OnScroll()
Dim i As Integer
With TChart1.Tools
For i = 0 To .Count - 1
With .Items(i).asAnnotation
.Left = .Left + (XActual - XDown)
.Top = .Top + (YActual - YDown)
.Callout.XPosition = .Callout.XPosition + (XActual - XDown)
.Callout.YPosition = .Callout.YPosition + (YActual - YDown)
End With
Next i
XDown = XActual
YDown = YActual
End With
End Sub