winform Chart控件 獲取鼠標處坐標值方法


Chart控件本身功能強大,應用廣泛,因此其屬性、方法也很多。
此處介紹在很多應用中需要查看鼠標位置處坐標值的一些方法

 

1,調用Chart事件  GetToolTip

利用ToolTipEventArgs ,將ToolTipEventArgs的Text屬性賦值即可實現,優點是非常簡單,無需其他步驟,但其因為用到HitTest方法,只能獲取序列點上的坐標值,不能獲得“空白”位置的值 

        private void chart_Wave1_GetToolTipText(object sender, ToolTipEventArgs e)  
        {  
            if (e.HitTestResult.ChartElementType == ChartElementType.DataPoint)  
            {  
                this.Cursor = Cursors.Cross;  
                int i = e.HitTestResult.PointIndex;  
                DataPoint dp = e.HitTestResult.Series.Points[i];                 
                e.Text = string.Format("數值:{1:F3}" + e.HitTestResult.Series.ChartArea + " \n日期:{0}", DateTime.FromOADate(dp.XValue), dp.YValues[0]);  
            }  
            else  
            {  
                this.Cursor = Cursors.Default;  
            }  
        }  

  

2.利用Chart的MouseMove事件和Chart方法 HitTest

特點是可以獲取鼠標值,同樣因為用到HitTest方法,只能獲取序列上序列點處的坐標值,且需要自我實現值的顯示

        private void chart_Wave1_MouseMove(object sender, MouseEventArgs e)  
        {  
           HitTestResult myTestResult=  chart_Wave1.HitTest(e.X,e.Y);  
           if (myTestResult.ChartElementType == ChartElementType.DataPoint)  
           {  
               this.Cursor = Cursors.Cross;  
               int i = myTestResult.PointIndex;  
               DataPoint dp = myTestResult.Series.Points[i];           
       
              double doubleXValue= (dp.XValue);  
              double doubleYValue = dp.YValues[0];     
              //自我實現值的顯示            
           }  
           else  
           {  
               this.Cursor = Cursors.Default;  
           }  
        }  

 

 

3.利用Chart的MouseMove事件和獲取鼠標處坐標實現

根據鼠標位置自動轉化為Chart控件ChartArea上的坐標值,再根據序列上(可以看成數組),可以找到每個序列點的坐標值,從而可以確定鼠標所在點在哪兩個序列點之間,再利用線性插值或其他插值算法,計算出該點的值。
特點,可以查找序列上任意位置的值,但實現相對復雜。

4.自動光標的實現

引用第三中方法其實只用知道X的位置就可以遍歷找出序列上該位置處的Y值,在很多情況下,需要添加自動光
標,自動獲取光標與序列焦點處的坐標值。因此還涉及到光標的實現,本人之前也嘗試過一些方法,

    • 新添加一條直線序列來代替,在鼠標移動時需要刪除之前的“序列光標”再添加新的“序列光標”,不夠流暢,效果不理想;
    • 嘗試用 GDI繪制一條直線作為光標,需要不能的刷新,效果也不太理想;
    • 最后GDI+異或繪制線條的方式,可以很好的解決這個問題,但仍有一個問題就是,在序列主動刷新(比如顯示實時數據波形,2秒鍾刷新一次)的時候,容易留下上次的光標痕跡,大家可以試試效果。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM