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
また、グラフラインがパネルの最後に達したときに達成したいと思います。それを行う方法についてのアイデアを提案できますか?
これは私の作業グラフのイメージです: