1

100 ミリ秒ごとにリアルタイム データを表示するアプリケーション用の簡単なグラフを作成しようとしています。そのため、メソッドを使用してグラフ線を描画できると考えDrawCurve、次のコードから始めました。

class BufferedPanel : Panel
{
     public BufferedPanel()
     {
        this.DoubleBuffered = true;         //to avoid flickering of the panel
     }                    
}



class Form2: Form
{
    BufferedPanel panel1 = new BufferedPanel();
    List<Point> graphPoints = new List<System.Drawing.Point>();

    private void Form2_Load(object sender, EventArgs e)
    {
       this.panel1.Paint += new System.Windows.Forms.PaintEventHandler(this.panel1_Paint);
    }

    private void panel1_Paint(object sender, PaintEventArgs e)
    {
        using (Graphics g = e.Graphics)
        {
            Point[] points = graphPoints.ToArray();
            g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;

            if (points.Length > 1)
               g.DrawCurve(graphPen, points);
         }
     }

     private void worker_ProgressChanged(object sender, ProgressChangedEventArgs e)
     {
         graphPoints.Add(new System.Drawing.Point(counter * steps, (int)(float)e.UserState));      //x - regular interval decided by a constant; y - simulated by background worker
         panel1.Refresh();
         counter++;
     }

}

現在、バックグラウンド ワーカー スレッドから graphPoints の値をシミュレートしています。私の問題は、パネルをダブルバッファリングしたときにグラフの線を表示できなかったことです。doublebuffering を false に設定するとうまく機能します。を使用して描画するのは初めてですGraphics。だから私はそれがどのように機能するのかよくわかりません。これで私を助けてください。

AutoScrollingまた、グラフラインがパネルの最後に達したときに達成したいと思います。それを行う方法についてのアイデアを提案できますか?

これは私の作業グラフのイメージです:

ここに画像の説明を入力

4

1 に答える 1

2
    using (Graphics g = e.Graphics)

良くないね。これにより、Paint イベント ハンドラーに渡された Graphics オブジェクトが破棄されます。イベントハンドラーが戻ったとき、そのオブジェクトに対して何もできません。それは死んだオウムです。したがって、ダブルバッファリングをオンにしたときに何が起こる必要があるかなど、後で何も機能するとは思わないでください。バッファを表示するには、画面に描画する必要があります。

usingステートメントまたは Dispose() メソッドを正しく使用するには、簡単なルールがあります。オブジェクトを作成した場合、それを所有するのはあなたであり、それを破棄するのはあなたです。あなたが作成したのではないので、手放してください。

「graphPen」変数でも間違っているという証拠があります。ペンは間違いなく Paint イベント ハンドラーで作成および破棄するオブジェクトです。GDI ヒープ内のスペースを不必要に占有するだけで、作成に必要な数マイクロ秒の価値がないものを保存しないでください。ペンには間違いなくusingステートメントを使用します。

したがって、簡単な修正は次のとおりです。

    var g = e.Graphics;
于 2012-12-15T12:08:07.503 に答える