Page 1 of 1

Zomming/Unzooming using Mouse Wheel

Posted: Mon Nov 30, 2009 9:27 am
by 15654246
Hi TeeChart Team,
I am trying to allow the user to zoom and unzoom using the Mouse Wheel.
I have 10 data series and each are having its own custop y axis of same size. Means no data is overlaped. Each data series is having its own separate y axis.
I found one topic on this kind of zooming in the forum. I did tried that and it worked.
But the problems i found are -

1. When i am unzooming, the data is getting compressed and compressed irrespective of the chart size. Is it possible to set the minimum limit after which unzoom will be stopped. That means, once the data is back to its normal view from the zoomed view, the unzoom should not happen anymore. Also the mouse wheel steps are not actually the history zooming steps. Can i make the mouse wheel unzoom based on History zooming steps?

2. Zooming is irrespective of the mouse position and direction. I mean, even if my mouse is at the corner of the chart, zomming is getting applied to the middle of the chart. My intention of using the mouse wheel in that corner is to zoom into that corner data. But once i zoom, the data itself going to the scrollable area. About direction - I have set the zoom direction to both but still the zooming is happening on in horizontal direction.

Please let me know how can i solve these problems.

Regards,
Avijit

Re: Zomming/Unzooming using Mouse Wheel

Posted: Mon Nov 30, 2009 9:41 am
by 13049497
I have had the same problem earlier today and written the following code:

Code: Select all

/// <summary>
        /// method zoom a given axis for one step (10%) in or out and recognize the current mouse position to zoom only the area where the mouse is
        /// </summary>
        /// <param name="axis">axis to zoom</param>
        /// <param name="zoomIn">in or out</param>
        /// <param name="mousePosition">current mouse point</param>
        protected static void ZoomAxis(Steema.TeeChart.Axis axis, Boolean zoomIn, Point mousePosition)
        {
            double zoomDelta = 0;
            double scrollDelta = 0;
            int mousePos = 0;
            if (zoomIn)
            {
                zoomDelta = (axis.Maximum - axis.Minimum) * 0.1;
            }
            else
            {
                zoomDelta = (axis.Maximum - axis.Minimum) * -(100.0/110.0/10.0);
            }

            if (axis.Horizontal)
            {
                mousePos = mousePosition.X;
            }
            else
            {
                mousePos = mousePosition.Y;
            }
            scrollDelta = (axis.CalcPosPoint(mousePos) - axis.Minimum) / ((axis.Maximum - axis.Minimum) / 2.0);
            axis.SetMinMax(axis.Minimum + (zoomDelta * scrollDelta), axis.Maximum - (zoomDelta * (2 - scrollDelta)));
        }
In addition you must set zoomed property to true after a call of this function and also it is recommend to set autorepaint to false before calling the function for each axis and at the end call chart.Refresh(). Within the UndoneZoom event of the chart you must set the automatic property of each axis to true due to the use of SetMinMax().

I hope it helps :)

Re: Zomming/Unzooming using Mouse Wheel

Posted: Mon Nov 30, 2009 11:31 am
by 15654246
Hi AIS,
Your code is solving the 2nd problem very well.
Thanks for the help.

Regards,
Avijit

Re: Zomming/Unzooming using Mouse Wheel

Posted: Mon Nov 30, 2009 2:08 pm
by yeray
Hi Avijit,

Please take a look at the following example and see if it is doing what you expected. I'm using MouseScroll event to zoom/unzoom all the custom axis and the bottom axis as well.
I've also added the BeforeDrawValues and AfterDrawValues events like in the demo at All Featres\Welcome !\Axes\Opaque zones

Code: Select all

        public Form1()
        {
            InitializeComponent();
            InitializeChart();
        }

        private void InitializeChart()
        {
            chartController1.Chart = tChart1;

            tChart1.Aspect.View3D = false;
            tChart1.Panel.MarginLeft = 7;

            int nSeries = 4;                        

            for (int i = 0; i < nSeries; i++)
            {
                new Steema.TeeChart.Styles.FastLine(tChart1.Chart);
                tChart1.Axes.Custom.Add(new Steema.TeeChart.Axis(tChart1.Chart));
                tChart1.Axes.Custom[i].AxisPen.Color = tChart1[i].Color;
                tChart1[i].FillSampleValues(50);
                tChart1[i].CustomVertAxis = tChart1.Axes.Custom[i];
                tChart1[i].BeforeDrawValues += new Steema.TeeChart.PaintChartEventHandler(lines_BeforeDrawValues);
                tChart1[i].AfterDrawValues += new Steema.TeeChart.PaintChartEventHandler(lines_AfterDrawValues);
            }

            tChart1.Draw();
            Rectangle rect = tChart1.Chart.ChartRect;

            for (int i = 0; i < tChart1.Series.Count; i++)
            {
                tChart1.Axes.Custom[i].StartEndPositionUnits = Steema.TeeChart.PositionUnits.Pixels;             
                tChart1.Axes.Custom[i].StartPosition = i * (rect.Height / tChart1.Series.Count);
                tChart1.Axes.Custom[i].EndPosition = (i + 1) * (rect.Height / tChart1.Series.Count);
            }

            tChart1.MouseWheel += new MouseEventHandler(tChart1_MouseWheel);            
        }

        void lines_AfterDrawValues(object sender, Steema.TeeChart.Drawing.Graphics3D g)
        {
            tChart1.Graphics3D.ClearClipRegions();
        }

        void lines_BeforeDrawValues(object sender, Steema.TeeChart.Drawing.Graphics3D g)
        {
            Steema.TeeChart.Styles.Series s = sender as Steema.TeeChart.Styles.Series;

            int left = s.GetHorizAxis.IStartPos;
            int right = s.GetHorizAxis.IEndPos;
            int top = s.GetVertAxis.IStartPos;
            int bottom = s.GetVertAxis.IEndPos;
            tChart1.Graphics3D.ClipRectangle(left, top, right, bottom);
        }        

        void tChart1_MouseWheel(object sender, MouseEventArgs e)
        {
            double AMin, AMax, tmpDelta;

            if (e.Delta > 0)
            {
                for (int i = 0; i < tChart1.Axes.Custom.Count; i++)
                {                    
                    AMin = tChart1.Axes.Custom[i].CalcPosPoint(tChart1.Axes.Custom[i].IEndPos);
                    AMax = tChart1.Axes.Custom[i].CalcPosPoint(tChart1.Axes.Custom[i].IStartPos);
                    tmpDelta = (AMax - AMin) * 0.1;
                    tChart1.Axes.Custom[i].SetMinMax(AMin + tmpDelta, AMax - tmpDelta);
                }
                AMin = tChart1.Axes.Bottom.CalcPosPoint(tChart1.Axes.Bottom.IEndPos);
                AMax = tChart1.Axes.Bottom.CalcPosPoint(tChart1.Axes.Bottom.IStartPos);
                tmpDelta = (AMax - AMin) * 0.1;
                tChart1.Axes.Bottom.SetMinMax(AMin + tmpDelta, AMax - tmpDelta);
            }
            else
            {
                for (int i = 0; i < tChart1.Axes.Custom.Count; i++)
                {
                    AMin = tChart1.Axes.Custom[i].CalcPosPoint(tChart1.Axes.Custom[i].IEndPos);
                    AMax = tChart1.Axes.Custom[i].CalcPosPoint(tChart1.Axes.Custom[i].IStartPos);
                    tmpDelta = (AMax - AMin) * (-0.1);
                    tChart1.Axes.Custom[i].SetMinMax(AMin + tmpDelta, AMax - tmpDelta);
                }
                AMin = tChart1.Axes.Bottom.CalcPosPoint(tChart1.Axes.Bottom.IEndPos);
                AMax = tChart1.Axes.Bottom.CalcPosPoint(tChart1.Axes.Bottom.IStartPos);
                tmpDelta = (AMax - AMin) * (-0.1);
                tChart1.Axes.Bottom.SetMinMax(AMin + tmpDelta, AMax - tmpDelta);
            }
        }

Re: Zomming/Unzooming using Mouse Wheel

Posted: Mon Nov 30, 2009 3:11 pm
by 13049497
For a correct zoom in and zoom out calculation step wise there is a good explanation from narcis within this thread

Re: Zomming/Unzooming using Mouse Wheel

Posted: Mon Nov 30, 2009 3:15 pm
by narcis
Hello AIS and Avijit,

Also there's Zoom.History which is a new property in TeeChart for .NET 2009 and is false by default. It's a historical recording of Chart zoom-ins, so that zoom-out is in their reverse sequence. You can find an example at What's New?\Welcome !\New in Zoom and Scroll\Zoom History in the features demo included with v2009.