0

C# で Windows フォーム アプリケーションを使用しています。ライセンス版の TeeChart for.net v3 をインストールしました。TeeChart の不要な部分を削除しようとしています。
stackoverflow Web サイト ユーザーのおかげで、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);
    }

}

上記のコードは、以下に示すようなポップアップを作成しています。 画像
「7.6cc用」と「7.6ccまで」の機能を実装しようとしています。「To 7.6 cc」をクリックすると、チャートは「0 to 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

From / Toを「カット」する値がわかっている場合は、下軸の最小プロパティと最大プロパティを設定するだけです。

「To7.6cc」をクリックすると、チャートは「0から7.6」のスケールから削除され、残りの部分がそこにあるはずです。

これは:

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

「145ccから」クリックにも同じことが当てはまり、「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;
    } 

また、イベントで作成するのが遅すぎるため、ContextMenuインmainTChart_MouseDownイベントを作成することをお勧めします。表示されるコンテキストメニューには、更新されたバージョンが表示されません。mainTChart_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 に答える