经过不懈的努力,和参考各种别人写的资料,终于捣鼓出来初版的 可拖动StripLine来选择范围。
首先画竖线是通过Chart你的StripLine实现:
StripLine sl1 = new StripLine();//新建一个插入线
sl1.BackColor = System.Drawing.Color.Red
sl1.IntervalOffset = 2;//通过IntervalOffset来设置线的位置
sl1.StripWidth = 1;//设置线的宽度
sl1.Tag = 1;//设置线的标记,用于区分选中的哪个
//sl1.TextAlignment = StringAlignment.Near;
chart1.ChartAreas[0].AxisX.StripLines.Add(sl1);//插入垂直于X轴的StripLine,若垂直于Y轴则用AxisY。
然后就是chart的鼠标事件,我主要用了MouseDown、MouseUp、MouseMove三个事件来实现选中StripLine,拖动以及更新。
下面放一些主要事件代码:
MouseDown事件选中StripLine,其中判定选中的哪一条StripLine是通过Tag来判断的(这个搞了好久···)
private void chart1_MouseDown(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Right) return;//右键忽略
HitTestResult hit = chart1.HitTest(e.X, e.Y);
if (hit.ChartElementType == ChartElementType.StripLines)
{
this.Cursor = Cursors.SizeWE;//鼠标变成左右有箭头的形式
StripLine sltemp = new StripLine();
//hit.Object = sltemp;
sltemp = hit.Object as StripLine;
//var sltemp = ConvertObject<StripLine>(hit.Object);
int a = (int)sltemp.Tag; //获得选中的StripLine的Tag
if (a == 1)
{
striplineselcet = 0;
this.chart1.MouseMove += new
MouseEventHandler(chart1_MouseMove);
}
else if (a == 2)
{
striplineselcet = 1;
this.chart1.MouseMove += new
MouseEventHandler(chart1_MouseMove);
}
}
}
MouseMove是获得当前鼠标位置对应的横坐标位置:
private void chart1_MouseMove(object sender, MouseEventArgs e)
{
var area = chart1.ChartAreas[0];
HitTestResult hit = chart1.HitTest(e.X, e.Y);
//需先判断鼠标在绘图区,否则PixelPositionToValue会超出范围
if (hit.ChartElementType == ChartElementType.PlottingArea)
{
xv = chart1.ChartAreas[0].AxisX.PixelPositionToValue(e.X);//xv是定义好的全局变量
var yv = chart1.ChartAreas[0].AxisY.PixelPositionToValue(e.Y);
richTextBox1.Text = "x = " + xv.ToString("N3") + "\n" + " y =" + yv.ToString("N3");
labelX.Text = "X:" + xv.ToString("N3");
labelY.Text = "Y:" + yv.ToString("N3");
}
labeleX.Text = "e.X:" + e.X.ToString("N3");
labeleY.Text = "e.Y:" + e.Y.ToString("N3");
}
最后就是MouseUp事件,用来将选择的StripLine释放掉,同时更新线的位置:
private void chart1_MouseUp(object sender, MouseEventArgs e)
{
if (striplineselcet == 0)
sl1.IntervalOffset = xv;
else if (striplineselcet == 1)
sl2.IntervalOffset = xv;
//sl1.IntervalOffset = lcl;
//sl2.IntervalOffset = ucl;
tBLCL.Text = sl1.IntervalOffset.ToString("N5");
tBUCL.Text = sl2.IntervalOffset.ToString("N5");
chart1.Invalidate();
striplineselcet = 2;
this.Cursor = Cursors.Default;//鼠标变回默认形态
}
以上就基本完成了,只是不能实时的更新的拖动中的线。
附上界面图:
以上主要参考如下大神的资源:
https://www.it1352.com/509041.html
https://blog.csdn.net/qq_30725967/article/details/86502990
https://www.cnblogs.com/puffy/p/11440775.html
菜鸟第一次发稿,大家将就看哈~~~