【问题标题】:How to remove some part of start, end of TeeChart如何删除 TeeChart 开始、结束的某些部分
【发布时间】:2013-02-22 08:41:35
【问题描述】:

我正在使用 c# 中的 windows 窗体应用程序。我已经安装了 TeeChart for.net v3 的许可版本。我正在尝试删除 TeeChart 中一些不需要的部分。
感谢 stackoverflow 网站用户,他们帮助我在 TeeChart 上创建了一个鼠标单击弹出窗口。现在我想为该弹出点击实现一些功能。
使用下面的代码,我可以创建鼠标右键单击弹出窗口。

double m_dblTempVolFromTo = 0;
double dtFromTo = 0;
private void mainTChart_MouseUp(object sender, MouseEventArgs e)
{
    if (!checkBoxIsTime.Checked && e.Button == MouseButtons.Right)
    {
        m_dblTempVolFromTo = mainTChart.Series[0].XScreenToValue(e.X);
        mainTChart.ContextMenu = new ContextMenu();
        mainTChart.ContextMenu.MenuItems.Add(new MenuItem("From " + m_dblTempVolFromTo + " cc"));
        mainTChart.ContextMenu.MenuItems.Add(new MenuItem("To " + m_dblTempVolFromTo + " cc"));
        mainTChart.ContextMenu.MenuItems[0].Click += new EventHandler(From_Click);
        mainTChart.ContextMenu.MenuItems[1].Click += new EventHandler(To_Click);

    }
    else if (checkBoxIsTime.Checked && e.Button == MouseButtons.Right)
    {
        DateTime dt;
        dtFromTo = mainTChart.Series[0].XScreenToValue(e.X);
        DateTime.TryParse(dtFromTo.ToString(), out dt);
        mainTChart.ContextMenu = new ContextMenu();
        mainTChart.ContextMenu.MenuItems.Add(new MenuItem("From " + dt.TimeOfDay.ToString() ));
        mainTChart.ContextMenu.MenuItems.Add(new MenuItem("To " + dt.TimeOfDay.ToString()));
        mainTChart.ContextMenu.MenuItems[0].Click += new EventHandler(From_Click);
        mainTChart.ContextMenu.MenuItems[1].Click += new EventHandler(To_Click);
    }

}

上面的代码正在创建弹出窗口,如下所示。
我正在尝试实现“For 7.6 cc”和“To 7.6 cc”的功能。 当我单击“到 7.6 cc”时,图表应该从“0 到 7.6”比例删除,剩余部分应该在那里。同样适用于“从 145 cc”点击,它必须从“145 到 150(刻度结束)”中删除图表。
单击“To”用于删除图表的起始部分,单击“From”用于删除图表的结束部分。
我试过这样,但我无法得到我想要的。

void From_Click(object sender, EventArgs e)
{
    if (!checkBoxIsTime.Checked)
    {
        var destBitmap = mainTChart.Export.Image.Bitmap.Clone(new Rect(0, 0, 100, 200), sourceBitmap.PixelFormat);
    }
}

void To_Click(object sender, EventArgs e)
{

} 

即使我也尝试过这段代码

void mainTChart_GetLegendRect(object sender, mainTChart.GetLegendRectEventArgs e)
{
    Rectangle cropRect = e.Rectangle;
    Bitmap legendImg = new Bitmap(cropRect.Width, cropRect.Height);

    using (Graphics g = Graphics.FromImage(legendImg))
    {
      g.DrawImage(chartBmp, new Rectangle(0, 0, mainTChart.Width, mainTChart.Height),
                 cropRect,
                 GraphicsUnit.Pixel);
    }
} 

没有什么对我有用。谁能帮我完成这项任务。

提前致谢。

已编辑 当我将 X 轴作为时间时,我无法在鼠标单击时获得显示时间。我试过的代码如下所示

 DateTime dt;
        dtFromTo = mainTChart.Series[0].XScreenToValue(e.X);
        DateTime.TryParse(dtFromTo.ToString(), out dt);
        mainTChart.ContextMenu = new ContextMenu();
        mainTChart.ContextMenu.MenuItems.Add(new MenuItem("From " + dt.TimeOfDay.ToString() ));
        mainTChart.ContextMenu.MenuItems.Add(new MenuItem("To " + dt.TimeOfDay.ToString()));

我是这样的 我得到如上图所示,但想在鼠标右键单击时显示等效时间。我得到了这个变量“dtFromTo”的一些价值,比如 41322.9876587965”,但我无法将该值转换为时间。请帮助我。

【问题讨论】:

    标签: c# winforms teechart


    【解决方案1】:

    知道你想从/到“剪切”的值,你可以设置底部轴的最小值和最大值属性。

    当我单击“至 7.6 cc”时,图表应从“0 至 7.6”移除 规模和剩余部分应该在那里

    这将是:

    mainTChart.Axes.Bottom.AutomaticMinimum = false;
    mainTChart.Axes.Bottom.Minimum = 7.6;
    

    同样适用于“来自 145 cc”点击,它必须删除 从“145 到 150(刻度结束)”的图表。

    这将通过设置最大值来完成:

    mainTChart.Axes.Bottom.AutomaticMaximum = false;
    mainTChart.Axes.Bottom.Maximum = 145;
    

    所以我认为这应该是诀窍:

        void From_Click(object sender, EventArgs e)
        {
            mainTChart.Axes.Bottom.AutomaticMaximum = false;
            mainTChart.Axes.Bottom.Maximum = m_dblTempVolFromTo;
        }
    
        void To_Click(object sender, EventArgs e)
        {
            mainTChart.Axes.Bottom.AutomaticMinimum = false;
            mainTChart.Axes.Bottom.Minimum = m_dblTempVolFromTo;
        } 
    

    我还建议您在 mainTChart_MouseDown 事件中创建 ContextMenu mainTChart_MouseUp,因为在 mainTChart_MouseUp 事件中创建它为时已晚,显示的 ContextMenu 不会显示更新的版本。

    编辑:

    对于 DateTime XValues,错误的行是这一行:

    DateTime.TryParse(dtFromTo.ToString(), out dt);
    

    这是对我来说似乎可以正常工作的完整代码:

        private void InitializeChart()
        {
            mainTChart.Aspect.View3D = false;
    
            Line line1 = new Line(mainTChart.Chart);
            line1.XValues.DateTime = true;
            line1.FillSampleValues();
            mainTChart.Axes.Bottom.Labels.DateTimeFormat = "hh:mm";
    
            mainTChart.MouseDown += new MouseEventHandler(mainTChart_MouseDown);
        }
    
        double m_dblTempVolFromTo = 0;
        double dtFromTo = 0;
    
        void mainTChart_MouseDown(object sender, MouseEventArgs e)
        {
            if (!mainTChart.Axes.Bottom.IsDateTime && e.Button == MouseButtons.Right)
            {
                m_dblTempVolFromTo = mainTChart[0].XScreenToValue(e.X);
                mainTChart.ContextMenu = new ContextMenu();
                mainTChart.ContextMenu.MenuItems.Add(new MenuItem("From " + m_dblTempVolFromTo + " cc"));
                mainTChart.ContextMenu.MenuItems.Add(new MenuItem("To " + m_dblTempVolFromTo + " cc"));
                mainTChart.ContextMenu.MenuItems[0].Click += new EventHandler(From_Click);
                mainTChart.ContextMenu.MenuItems[1].Click += new EventHandler(To_Click);
    
            }
            else if (e.Button == MouseButtons.Right)
            {
                dtFromTo = mainTChart[0].XScreenToValue(e.X);
                String stFromTo = mainTChart.Axes.Bottom.Labels.LabelValue(dtFromTo);
                mainTChart.ContextMenu = new ContextMenu();
                mainTChart.ContextMenu.MenuItems.Add(new MenuItem("From " + stFromTo));
                mainTChart.ContextMenu.MenuItems.Add(new MenuItem("To " + stFromTo));
                mainTChart.ContextMenu.MenuItems[0].Click += new EventHandler(From_Click);
                mainTChart.ContextMenu.MenuItems[1].Click += new EventHandler(To_Click);
            }
        }
    
        void From_Click(object sender, EventArgs e)
        {
            mainTChart.Axes.Bottom.AutomaticMaximum = false;
            if (!mainTChart.Axes.Bottom.IsDateTime)
                mainTChart.Axes.Bottom.Maximum = m_dblTempVolFromTo;
            else
                mainTChart.Axes.Bottom.Maximum = dtFromTo;
        }
    
        void To_Click(object sender, EventArgs e)
        {
            mainTChart.Axes.Bottom.AutomaticMinimum = false;
            if (!mainTChart.Axes.Bottom.IsDateTime)
                mainTChart.Axes.Bottom.Minimum = m_dblTempVolFromTo;
            else
                mainTChart.Axes.Bottom.Minimum = dtFromTo;
        } 
    

    【讨论】:

    • 非常感谢您的帮助,它运行良好,但我还有一个小疑问,我已经向弹出窗口添加了一个“重置”功能。当我单击“重置”时,它必须执行撤消操作。你能帮我吗?
    • 您能否介绍一下如何实现“重置”功能。
    • 感谢您的回答,现在我也根据您的想法实施了“重置”。非常感谢
    • 您可以为重置 (Reset_Click) 添加第三个 MenuItem 并将底部轴 AutomaticMinimumAutomaticMaximum 属性设置为 true。
    • 感谢您的回复,我有一个小问题,很抱歉再次询问,我不想将此问题作为另一个问题发布。我在问你,请尝试帮助我。在上面的代码中,我有 X 轴,一个是音量,另一个是时间。当使用此行“m_dblTempVolFromTo = mainTChart.Series[0].XScreenToValue(e.X);”时,我正在获取 X 轴值。但是当我将时间作为 x 轴时,我尝试了相同的过程,但时间总是显示“00:00:00”。我是使用上面代码的一些值,但我无法及时显示该值。对此有任何想法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-08-10
    • 2021-08-14
    • 1970-01-01
    • 2023-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多