0

我正在使用 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”,但我无法将该值转换为时间。请帮助我。

4

1 回答 1

2

已知要从/到“剪切”的值,您只需设置底部轴的最小值和最大值属性。

当我单击“到 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;
    } 

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

编辑:

对于 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;
    } 
于 2013-02-22T12:32:30.550 回答