rueda reducido raton maximo hasta hacer funcion eventos desactivar configurar como central cambiar boton c# microsoft-chart-controls

c# - reducido - Cómo habilitar el zoom en el control de gráficos de Microsoft usando la rueda del mouse



ya se ha reducido el zoom hasta el maximo autocad (3)

Estoy usando Microsoft Chart control en mi proyecto y quiero habilitar la función de zoom en Chart Control usando la Rueda del Ratón, ¿cómo puedo lograr esto?

pero el usuario no tiene que hacer clic en el gráfico. Debería ser como si la posición del mouse estuviera en mi Chart que desde ese punto en adelante, con la rueda del mouse girando, se puede acercar / alejar.


Modifiqué el código de arriba y agregué un zoom inverso. Por lo tanto, cuando gire la rueda del ratón hacia atrás, el gráfico se alejará. Además, no recomiendo usar 2 ^ n como divisor del intervalo porque causa retraso.

numberOfZoom - counter of Zooming private void Chart1_MouseWheel(object sender, MouseEventArgs e) { var chart = (Chart)sender; var xAxis = chart.ChartAreas[0].AxisX; var yAxis = chart.ChartAreas[0].AxisY; var xMin = xAxis.ScaleView.ViewMinimum; var xMax = xAxis.ScaleView.ViewMaximum; var yMin = yAxis.ScaleView.ViewMinimum; var yMax = yAxis.ScaleView.ViewMaximum; int IntervalX = 3; int IntervalY = 3; try { if (e.Delta < 0 && numberOfZoom > 0) // Scrolled down. { var posXStart = xAxis.PixelPositionToValue(e.Location.X) - IntervalX *2/ Math.Pow(2, numberOfZoom); var posXFinish = xAxis.PixelPositionToValue(e.Location.X) + IntervalX *2/ Math.Pow(2, numberOfZoom); var posYStart = yAxis.PixelPositionToValue(e.Location.Y) - IntervalY*2 / Math.Pow(2, numberOfZoom); var posYFinish = yAxis.PixelPositionToValue(e.Location.Y) + IntervalY*2 / Math.Pow(2, numberOfZoom); if (posXStart < 0) posXStart = 0; if (posYStart < 0) posYStart = 0; if (posYFinish > yAxis.Maximum) posYFinish = yAxis.Maximum; if (posXFinish > xAxis.Maximum) posYFinish = xAxis.Maximum; xAxis.ScaleView.Zoom(posXStart, posXFinish); yAxis.ScaleView.Zoom(posYStart, posYFinish); numberOfZoom--; }else if (e.Delta < 0 && numberOfZoom == 0) //Last scrolled dowm { yAxis.ScaleView.ZoomReset(); xAxis.ScaleView.ZoomReset(); } else if (e.Delta > 0) // Scrolled up. { var posXStart = xAxis.PixelPositionToValue(e.Location.X) - IntervalX / Math.Pow(2, numberOfZoom); var posXFinish = xAxis.PixelPositionToValue(e.Location.X) + IntervalX / Math.Pow(2, numberOfZoom); var posYStart = yAxis.PixelPositionToValue(e.Location.Y) - IntervalY / Math.Pow(2, numberOfZoom); var posYFinish = yAxis.PixelPositionToValue(e.Location.Y) + IntervalY / Math.Pow(2, numberOfZoom); xAxis.ScaleView.Zoom(posXStart, posXFinish); yAxis.ScaleView.Zoom(posYStart, posYFinish); numberOfZoom++; } if (numberOfZoom < 0) numberOfZoom = 0; } catch { } }


Waaaay tarde a la fiesta, pero hoy tuve este desafío. Estoy seguro de que lo siguiente puede mejorarse, aún así, pero es lo que se me ocurrió. Probé esto con .net 4.5.2 y 4.6, por lo que no estoy seguro de si funciona con marcos anteriores.

He combinado un par de respuestas del pasado e hice lo siguiente:

using System; using System.Windows.Forms; using System.Windows.Forms.DataVisualization.Charting; namespace ExampleApp { public partial class Form1 : Form { private int FZoomLevel = 0; public Form1() { InitializeComponent(); chart1.MouseWheel += Chart1_MouseWheel; } private void Chart1_MouseEnter(object sender, EventArgs e) { if (!chart1.Focused) chart1.Focus(); } private void Chart1_MouseLeave(object sender, EventArgs e) { if (chart1.Focused) chart1.Parent.Focus(); } private void Chart1_MouseWheel(object sender, MouseEventArgs e) { try { Axis xAxis = chart1.ChartAreas[0].AxisX; double xMin = xAxis.ScaleView.ViewMinimum; double xMax = xAxis.ScaleView.ViewMaximum; double xPixelPos = xAxis.PixelPositionToValue(e.Location.X); if (e.Delta < 0 && FZoomLevel > 0) { // Scrolled down, meaning zoom out if (--FZoomLevel <= 0) { FZoomLevel = 0; xAxis.ScaleView.ZoomReset(); } else { double xStartPos = Math.Max(xPixelPos - (xPixelPos - xMin) * CZoomScale, 0); double xEndPos = Math.Min(xStartPos + (xMax - xMin) * CZoomScale, xAxis.Maximum); xAxis.ScaleView.Zoom(xStartPos, xEndPos); } } else if (e.Delta > 0) { // Scrolled up, meaning zoom in double xStartPos = Math.Max(xPixelPos - (xPixelPos - xMin) / CZoomScale, 0); double xEndPos = Math.Min(xStartPos + (xMax - xMin) / CZoomScale, xAxis.Maximum); xAxis.ScaleView.Zoom(xStartPos, xEndPos); FZoomLevel++; } } catch { } } } }


Querrás usar el evento MouseWheel .

En primer lugar, haga que ambos ejes de su gráfico se puedan ampliar:

chart1.ChartAreas[0].AxisX.ScaleView.Zoomable = true; chart1.ChartAreas[0].AxisY.ScaleView.Zoomable = true;

Y asigna el evento:

chart1.MouseWheel += chart1_MouseWheel;

Luego en el controlador de eventos:

private void chart1_MouseWheel(object sender, MouseEventArgs e) { var chart = (Chart)sender; var xAxis = chart.ChartAreas[0].AxisX; var yAxis = chart.ChartAreas[0].AxisY; try { if (e.Delta < 0) // Scrolled down. { xAxis.ScaleView.ZoomReset(); yAxis.ScaleView.ZoomReset(); } else if (e.Delta > 0) // Scrolled up. { var xMin = xAxis.ScaleView.ViewMinimum; var xMax = xAxis.ScaleView.ViewMaximum; var yMin = yAxis.ScaleView.ViewMinimum; var yMax = yAxis.ScaleView.ViewMaximum; var posXStart = xAxis.PixelPositionToValue(e.Location.X) - (xMax - xMin) / 4; var posXFinish = xAxis.PixelPositionToValue(e.Location.X) + (xMax - xMin) / 4; var posYStart = yAxis.PixelPositionToValue(e.Location.Y) - (yMax - yMin) / 4; var posYFinish = yAxis.PixelPositionToValue(e.Location.Y) + (yMax - yMin) / 4; xAxis.ScaleView.Zoom(posXStart, posXFinish); yAxis.ScaleView.Zoom(posYStart, posYFinish); } } catch { } }

La propiedad e.Delta le dice cuántos "desplazamientos" de las ruedas ha hecho, y puede ser útil.
Desplazarse hacia fuera se alejará todo el camino.

Probablemente hay una forma más limpia de hacer esto, pero ahí está. ¡Espero que esto ayude!