【发布时间】:2017-06-29 04:19:13
【问题描述】:
我正在尝试在 MSCharts(Microsoft Charting Controls)中创建自己的自定义平移功能。我意识到有一个缩放和平移的扩展,但是它没有我想要的很多功能。这是我目前拥有的平移功能:
//handles mouse panning, will pan while mouse left click if held down..
private int prevx = 0;
private int prevy = 0;
private void Mouse_Up(object sender, MouseEventArgs e)
{
//reset previous x and y on mouse click up
if (e.Button == MouseButtons.Left)
{
prevx = 0;
prevy = 0;
}
}
private void Mouse_Move(object sender, MouseEventArgs e, Chart chart)
{
//if mouse was moved and mouse left click
if (e.Button == MouseButtons.Left)
{
//a scalar, not entirely sure how useful it is, only works for my viewport
double incr = 0.00130;
if (prevx != 0 && prevy != 0)
{
//find x and y difference in mouse movement
int diffx = e.X - prevx;
int diffy = e.Y - prevy;
//how much to increment x and y
double incrx = incr * Math.Abs(diffx);
double incry = incr * Math.Abs(diffy);
//get chart mins and maxs for both axes
double minX = chart.ChartAreas[0].AxisX.Minimum;
double maxX = chart.ChartAreas[0].AxisX.Maximum;
double minY = chart.ChartAreas[0].AxisY.Minimum;
double maxY = chart.ChartAreas[0].AxisY.Maximum;
if (diffx > 0 && diffy > 0)
{
chart.ChartAreas[0].AxisX.Minimum -= (maxX - minX) * incrx;
chart.ChartAreas[0].AxisX.Maximum -= (maxX - minX) * incrx;
chart.ChartAreas[0].AxisY.Minimum += (maxY - minY) * incry;
chart.ChartAreas[0].AxisY.Maximum += (maxY - minY) * incry;
//Console.WriteLine("upleft");
}
else if (diffx < 0 && diffy > 0)
{
chart.ChartAreas[0].AxisX.Minimum += (maxX - minX) * incrx;
chart.ChartAreas[0].AxisX.Maximum += (maxX - minX) * incrx;
chart.ChartAreas[0].AxisY.Minimum += (maxY - minY) * incry;
chart.ChartAreas[0].AxisY.Maximum += (maxY - minY) * incry;
//Console.WriteLine("upright");
}
else if (diffx > 0 && diffy < 0)
{
chart.ChartAreas[0].AxisX.Minimum -= (maxX - minX) * incrx;
chart.ChartAreas[0].AxisX.Maximum -= (maxX - minX) * incrx;
chart.ChartAreas[0].AxisY.Minimum -= (maxY - minY) * incry;
chart.ChartAreas[0].AxisY.Maximum -= (maxY - minY) * incry;
//Console.WriteLine("bottom left");
}
else if (diffx < 0 && diffy < 0)
{
chart.ChartAreas[0].AxisX.Minimum += (maxX - minX) * incrx;
chart.ChartAreas[0].AxisX.Maximum += (maxX - minX) * incrx;
chart.ChartAreas[0].AxisY.Minimum -= (maxY - minY) * incry;
chart.ChartAreas[0].AxisY.Maximum -= (maxY - minY) * incry;
//Console.WriteLine("bottomright");
}
else if (diffx > 0 && diffy == 0)
{
chart.ChartAreas[0].AxisX.Minimum -= (maxX - minX) * incrx;
chart.ChartAreas[0].AxisX.Maximum -= (maxX - minX) * incrx;
//Console.WriteLine("right");
}
else if (diffx < 0 && diffy == 0)
{
chart.ChartAreas[0].AxisX.Minimum += (maxX - minX) * incrx;
chart.ChartAreas[0].AxisX.Maximum += (maxX - minX) * incrx;
//Console.WriteLine("left");
}
else if (diffy > 0 && diffx == 0)
{
chart.ChartAreas[0].AxisY.Minimum += (maxY - minY) * incry;
chart.ChartAreas[0].AxisY.Maximum += (maxY - minY) * incry;
//Console.WriteLine("down");
}
else if (diffy < 0 && diffx == 0)
{
chart.ChartAreas[0].AxisY.Minimum -= (maxY - minY) * incry;
chart.ChartAreas[0].AxisY.Maximum -= (maxY - minY) * incry;
//Console.WriteLine("up");
}
}
prevx = e.X;
prevy = e.Y;
}
}
我注意到有一个类似的问题,尽管它是在我没有经验的 JavaFX 中。我设想的平移功能应该能够随着图形移动鼠标。因此,如果我单击某个点,向左拖动 50 像素,该点仍将直接位于我的鼠标下方。在我当前的视口中,这是可行的。但是,如果我使图表变小或变大,事情就不起作用了。当图形变小时,图形移动得比我的鼠标慢,当图形变大时,图形移动得比我的鼠标快。
我知道我可能应该以某种方式将视口或图表宽度包含在计算中,但我真的不知道如何。你们有这方面的经验吗?谢谢。
【问题讨论】:
-
最重要的是,您应该解释您缺少哪些功能以及它们应该如何工作..
-
@TaW,我编辑了帖子,希望底部能解释发生了什么。