Page 1 of 1
Zoom vs Panning
Posted: Mon Sep 28, 2009 12:26 pm
by 13052926
Hi
My chart is setup to allow Zoom using left mouse button.
I want user to be able to pan horizontally with the left mouse button as well. Obviously this is a problem because two different features cannot share the same left click.
I don't want to use KeyShift for either feature. My proposed 'solution' was:
1) Have Zoom.Allow = TRUE
2) If user clicks and holds left mouse down on a series, and then moves mouse (while holding button in), the chart will pan left and right.
I tried the following (the idea came from a link in another post for moving a series using mouse):
On ClickSeries event I set Zoom.Allow = False and Panning.Allow = ScrollModes.Horizontal
On MouseUp event I set the above two back; Zoom.Allow = True and Panning.Allow = ScrollModes.None
That doesn't appear to work unfortunately. Do you have any ideas for this?
Note (bug?): If I allow Zooming and Panning both with Left Mouse button, with Panning.KeyShift = Keys.Shift panning doesn't work but zooming does.
Re: Zoom vs Panning
Posted: Tue Sep 29, 2009 10:59 am
by yeray
Hi rossmc,
The problem is that activating the panning mode and deactivating the zoom mode at OnClickSeries event it's too late, and even at OnMouseDown.
On the other hand I think you can achieve that zooming and panning (scrolling) manually. Take a look at the following example, it seems to work fine here:
Code: Select all
public Form1()
{
InitializeComponent();
InitializeChart();
}
private void InitializeChart()
{
tChart1.Aspect.View3D = false;
Steema.TeeChart.Styles.Bar bar1 = new Steema.TeeChart.Styles.Bar(tChart1.Chart);
bar1.FillSampleValues(6);
tChart1.Zoom.Allow = false;
tChart1.Panning.Allow = Steema.TeeChart.ScrollModes.None;
tChart1.MouseDown += new MouseEventHandler(tChart1_MouseDown);
tChart1.MouseUp += new MouseEventHandler(tChart1_MouseUp);
tChart1.MouseMove += new MouseEventHandler(tChart1_MouseMove);
tChart1.AfterDraw += new Steema.TeeChart.PaintChartEventHandler(tChart1_AfterDraw);
}
private int MouseDownX, MouseDownY, MouseActX, MouseActY;
private double PreviousXMin, PreviousXMax;
private bool Zooming, Panning;
void tChart1_MouseDown(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Left)
{
MouseDownX = e.X;
MouseDownY = e.Y;
Zooming = true;
for (int i = 0; i < tChart1.Series.Count; i++)
{
if (tChart1[i].Clicked(e.X, e.Y) != -1) Zooming = false;
}
Panning = !Zooming;
if (Panning)
{
PreviousXMin = tChart1.Axes.Bottom.Minimum;
PreviousXMax = tChart1.Axes.Bottom.Maximum;
}
}
}
void tChart1_MouseUp(object sender, MouseEventArgs e)
{
if (Zooming)
{
if ((e.X < MouseDownX) && (e.Y < MouseDownY))
{
tChart1.Axes.Left.Automatic = true;
tChart1.Axes.Bottom.Automatic = true;
tChart1.Invalidate();
}
else
{
tChart1.Axes.Left.SetMinMax(tChart1.Axes.Left.CalcPosPoint(e.Y), tChart1.Axes.Left.CalcPosPoint(MouseDownY));
tChart1.Axes.Bottom.SetMinMax(tChart1.Axes.Bottom.CalcPosPoint(MouseDownX), tChart1.Axes.Bottom.CalcPosPoint(e.X));
}
}
Zooming = false;
Panning = false;
}
void tChart1_MouseMove(object sender, MouseEventArgs e)
{
if (Zooming)
{
MouseActX = e.X;
MouseActY = e.Y;
tChart1.Invalidate();
}
else if (Panning)
{
tChart1.Axes.Bottom.SetMinMax(tChart1.Axes.Bottom.CalcPosPoint(tChart1.Axes.Bottom.CalcPosValue(PreviousXMin) + e.X - MouseDownX), tChart1.Axes.Bottom.CalcPosPoint(tChart1.Axes.Bottom.CalcPosValue(PreviousXMax) + e.X - MouseDownX));
}
}
void tChart1_AfterDraw(object sender, Steema.TeeChart.Drawing.Graphics3D g)
{
if (Zooming)
{
tChart1.Graphics3D.Pen.Style = System.Drawing.Drawing2D.DashStyle.Dash;
tChart1.Graphics3D.BackColor = Color.Empty;
tChart1.Graphics3D.Rectangle(MouseDownX, MouseDownY, MouseActX, MouseActY);
}
}
}
Re: Zoom vs Panning
Posted: Thu Oct 08, 2009 12:40 pm
by 13052926
Hi Yeray
Even though I'm now not going to do this anymore, I discovered how to make this work quite easily. So in case a future VB reader wants to know how; When plotting the line I add event handlers for line.MouseEnter and line.MouseLeave.
Then:
In mouse enter event I simply set .Zoom.Allow = False and .Panning.Allow = ScrollModes.Horizontal
In mouse leave event I set .Zoom.Allow = True and .Panning.Allow = ScrollModes.None
That works.
Re: Zoom vs Panning
Posted: Fri Oct 09, 2009 12:01 pm
by yeray
Hi rossmc,
Thanks for the feedback!