トップ回答者
横へ流れる折れ線グラフの描画について

質問
-
いつもお世話になっております。
現在、外部の計測機器からデータを取得し、それを折れ線グラフとして描画するコードを記述しています。
新しいデータを取得するたびに、すでに描画したグラフを目盛一つ分左にずらし、新しいデータがグラフに追加されるというグラフにしたいと考えています。
現在、既存のグラフを左に一つずらすために、いったんグラフを削除し、一つずらしたグラフを再描画する、という手段で実現しようとしています。しかし、グラフの削除に、ピクチャボックスのimageプロパティにNULLを代入するという手段を取ったところ、ピクチャボックスに一切の線が描画されなくなってしまいました。
他にピクチャボックスをクリアする手段があるのでしょうか。それとも、そもそも私のコードが悪いのでしょうか。
まったく別の手段で折れ線グラフを実装する手段もありますでしょうか。
ご回答をお願いします。
以下、テスト用のソースコード
public void drowglaph() { //描画する数 const int numberOfDrowPoints = 15; //ピクチャボックスを初期化、有効にするとx軸目盛が描画されなくなる //glaphInit(); //Graphicsオブジェクトを作成 Graphics glaph = pctBox_glaph.CreateGraphics(); //penオブジェクトを作成(幅1色灰) Pen pCell = new Pen(Color.Gray, 1); //x軸目盛を描画 for (int i = 1; i <= numberOfDrowPoints; i++) { glaph.DrawLine(pCell, (pctBox_glaph.Width / numberOfDrowPoints) * i, 0, (pctBox_glaph.Width / numberOfDrowPoints) * i, pctBox_glaph.Height); } //リソース解放 glaph.Dispose(); pCell.Dispose(); } public void glaphInit() { pctBox_glaph.Image = null; }
回答
-
このソースで言うと、
ピクチャボックスのimageプロパティにNULLを代入したことで、ピクチャボックスに表示するものがなくなっているので、
その後で、そのイメージに対して描画の処理を行っても、何も無いところに描画しているようなもではないかと。
なので、何も描画されないのかとおもいます。
表示のクリアを、FillRectangleメソッドなどで描画エリアを塗りつぶすことでクリアしたことにしてはどうでしょう?
「背景塗りつぶし+線の描画」で1セットにするような感じになるかと思います。
すべての返信
-
上記の方法では、例えばフォームが別の画面の下に隠れた場合など、再度上に表示したら
描画内容が消えませんか?そもそも、ピクチャボックスのOnPaintのe.Graphicsに対して行うべきと思います。
また、別の手段ということで、MSChartコントロールというものがあります。
VisualStudio2010であれば標準で、2008以前であってもライブラリをダウンロード出来ます。
以下にMSChartに関する情報を簡潔にまとめてあります。
-
もしも WPF を使ってもいいのであれば、Dynamic Data Display というフリーのライブラリを使うと、リアルタイムの折れ線グラフが簡単に実装できます。
WPF Dynamic Data Display
http://dynamicdatadisplay.codeplex.com/
リアルタイム描画のサンプルも入っています。
試しに CPU 使用率のグラフを実装してみましたことがありますが、プロット用のバッファにデータを入れるだけでした。 -
このソースで言うと、
ピクチャボックスのimageプロパティにNULLを代入したことで、ピクチャボックスに表示するものがなくなっているので、
その後で、そのイメージに対して描画の処理を行っても、何も無いところに描画しているようなもではないかと。
なので、何も描画されないのかとおもいます。
表示のクリアを、FillRectangleメソッドなどで描画エリアを塗りつぶすことでクリアしたことにしてはどうでしょう?
「背景塗りつぶし+線の描画」で1セットにするような感じになるかと思います。