用鼠标悬停图表中的每个点

时间:2014-04-15 08:16:52

标签: c#

我在c#windows应用程序上有一个图表。 当鼠标放在它们上面时,我想缩放图表的每个点。 像谷歌地图

我的意思是我不想放大图表的所有部分 我想缩放像谷歌地图一样的特殊点

代码:

public partial class Form1 : Form
    {

        int[] myArrayX = new int[5];
        double[] myArrayY = new double[5];
        int lastX = -1;
        double lastY = -0.6;
        double xmax;

        Graph.Chart chart;
        public Form1()
        {
            InitializeComponent();
            this.MouseWheel += new MouseEventHandler(Form1_MouseWheel);
        }

        void Form1_MouseWheel(object sender, MouseEventArgs e)
        {

            try
            {
                if (e.Delta > 0)
                {
                    double xMin = chart.ChartAreas["draw"].AxisX.ScaleView.ViewMinimum;
                    double xMax = chart.ChartAreas["draw"].AxisX.ScaleView.ViewMaximum;
                    double yMin = chart.ChartAreas["draw"].AxisY.ScaleView.ViewMinimum;
                    double yMax = chart.ChartAreas["draw"].AxisY.ScaleView.ViewMaximum;

                    double posXStart = chart.ChartAreas["draw"].AxisX.PixelPositionToValue(e.Location.X) - (xMax - xMin) / 2;
                    double posXFinish = chart.ChartAreas["draw"].AxisX.PixelPositionToValue(e.Location.X) + (xMax - xMin) / 2;
                    double posYStart = chart.ChartAreas["draw"].AxisY.PixelPositionToValue(e.Location.Y) - (yMax - yMin) / 2;
                    double posYFinish = chart.ChartAreas["draw"].AxisY.PixelPositionToValue(e.Location.Y) + (yMax - yMin) / 2;

                    chart.ChartAreas["draw"].AxisX.ScaleView.Zoom(posXStart, posXFinish);
                    chart.ChartAreas["draw"].AxisY.ScaleView.Zoom(posYStart, posYFinish);
                }
                else if (e.Delta < 0)
                {
                    ZoomOut();
                }

            }
            catch { }


        }

        private void ZoomOut()
        {
            chart.ChartAreas["draw"].AxisX.ScaleView.ZoomReset();
            chart.ChartAreas["draw"].AxisY.ScaleView.ZoomReset();
        }



        void CreateNewGraph()
        {
            // Create new Graph
            chart = new Graph.Chart();


            chart.Location = new System.Drawing.Point(13, 185);


            chart.Size = new System.Drawing.Size(900, 500);


            chart.ChartAreas.Add("draw");




            chart.ChartAreas["draw"].AxisX.Minimum = 0;
            chart.ChartAreas["draw"].AxisX.Maximum = 20;


            chart.ChartAreas["draw"].AxisX.Interval = 1;


            chart.ChartAreas["draw"].AxisX.MajorGrid.LineColor = Color.White;


            chart.ChartAreas["draw"].AxisX.MajorGrid.LineDashStyle = Graph.ChartDashStyle.Dash;


            chart.ChartAreas["draw"].AxisY.Minimum = -0.4;
            chart.ChartAreas["draw"].AxisY.Maximum = 1;


            chart.ChartAreas["draw"].AxisY.Interval = 0.2;


            chart.ChartAreas["draw"].AxisY.MajorGrid.LineColor = Color.White;


            chart.ChartAreas["draw"].AxisY.MajorGrid.LineDashStyle = Graph.ChartDashStyle.Dash;


            chart.ChartAreas["draw"].BackColor = Color.Black;



            var series = chart.Series.Add("Test");


            chart.Series["Test"].ChartType = Graph.SeriesChartType.Line;


            chart.Series["Test"].Color = Color.Yellow;


            chart.Series["Test"].BorderWidth = 3;


            chart.Legends.Add("MyLegend");
            chart.Legends["MyLegend"].BorderColor = Color.YellowGreen;

            // Set automatic zooming
            chart.ChartAreas["draw"].AxisX.ScaleView.Zoomable = true;
            chart.ChartAreas["draw"].AxisY.ScaleView.Zoomable = true;

            // Set automatic scrolling 
            chart.ChartAreas["draw"].CursorX.AutoScroll = true;
            chart.ChartAreas["draw"].CursorY.AutoScroll = true;

            // Allow user selection for Zoom
            chart.ChartAreas["draw"].CursorX.IsUserSelectionEnabled = true;
            chart.ChartAreas["draw"].CursorY.IsUserSelectionEnabled = true;

            chart.ChartAreas["draw"].AxisX.ScaleView.Zoomable = true;
            chart.ChartAreas["draw"].AxisY.ScaleView.Zoomable = true;

            //chart.MouseWheel += new MouseEventHandler(chart_MouseWheel);
        }


        private void Form1_Load(object sender, EventArgs e)
        {
            CreateNewGraph();
        }

        private void timer1_Tick(object sender, EventArgs e)
        {
            fillarray();

            for (int i = 1; i <= 5; i += 1)
            {
                chart.Series["Test"].Points.AddXY(myArrayX[i - 1], myArrayY[i - 1]);
                xmax = myArrayX[i - 1];
            }

            if (xmax >= 20)
            {
                chart.ChartAreas["draw"].AxisX.ScrollBar.Enabled = true;
                chart.ChartAreas["draw"].AxisX.ScaleView.Zoomable = true;
                chart.ChartAreas["draw"].AxisX.ScaleView.Zoom(0, xmax);
            }

            Controls.Add(this.chart);

        }

        public void fillarray()
        {
            for (int i = 1; i <= 5; i += 1)
            {
                lastX = lastX + 1;
                myArrayX[i - 1] = lastX;

            }

            for (int i = 1; i < 5; i += 1)
            {
                lastY = lastY + 0.2;
                myArrayY[i - 1] = lastY;

            }


        }
    }

1 个答案:

答案 0 :(得分:0)

假设您使用&#34;标准&#34; (自.NET 4.0起)Charting Lib位于命名空间System.Windows.Forms.DataVisualization.Charting中。您可以实现自定义交互(当鼠标执行此操作时进行缩放)。 MSDN是一个良好的开端和GIYF。

http://msdn.microsoft.com/en-us/library/dd456772(v=vs.110).aspx

网络上还有很多examples

祝你好运!