电竞比分网-中国电竞赛事及体育赛事平台

分享

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

 行走在理想邊緣 2019-07-12

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

1,調(diào)用Chart事件  GetToolTip

利用ToolTipEventArgs ,將ToolTipEventArgs的Text屬性賦值即可實現(xiàn),優(yōu)點是非常簡單,無需其他步驟,但其因為用到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("數(shù)值:{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方法,只能獲取序列上序列點處的坐標值,且需要自我實現(xiàn)值的顯示
        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];   
              //自我實現(xiàn)值的顯示          
           }
           else
           {
               this.Cursor = Cursors.Default;
           }
        }

3.利用Chart的MouseMove事件和獲取鼠標處坐標實現(xiàn)

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

4.自動光標的實現(xiàn)

引用第三中方法其實只用知道X的位置就可以遍歷找出序列上該位置處的Y值,在很多情況下,需要添加自動光
標,自動獲取光標與序列焦點處的坐標值。因此還涉及到光標的實現(xiàn),本人之前也嘗試過一些方法,
  • 新添加一條直線序列來代替,在鼠標移動時需要刪除之前的“序列光標”再添加新的“序列光標”,不夠流暢,效果不理想;
  • 嘗試用 GDI繪制一條直線作為光標,需要不能的刷新,效果也不太理想;
  • 最后GDI+異或繪制線條的方式,可以很好的解決這個問題,但仍有一個問題就是,在序列主動刷新(比如顯示實時數(shù)據(jù)波形,2秒鐘刷新一次)的時候,容易留下上次的光標痕跡,大家可以試試效果。

    本站是提供個人知識管理的網(wǎng)絡存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多