none
横へ流れる折れ線グラフの描画について RRS feed

  • 質問

  • いつもお世話になっております。

    現在、外部の計測機器からデータを取得し、それを折れ線グラフとして描画するコードを記述しています。
    新しいデータを取得するたびに、すでに描画したグラフを目盛一つ分左にずらし、新しいデータがグラフに追加されるというグラフにしたいと考えています。
    現在、既存のグラフを左に一つずらすために、いったんグラフを削除し、一つずらしたグラフを再描画する、という手段で実現しようとしています。しかし、グラフの削除に、ピクチャボックスの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;
        }
    
    2011年1月7日 1:42

回答

  • このソースで言うと、
    ピクチャボックスのimageプロパティにNULLを代入したことで、ピクチャボックスに表示するものがなくなっているので、
    その後で、そのイメージに対して描画の処理を行っても、何も無いところに描画しているようなもではないかと。
    なので、何も描画されないのかとおもいます。

    表示のクリアを、FillRectangleメソッドなどで描画エリアを塗りつぶすことでクリアしたことにしてはどうでしょう?
    「背景塗りつぶし+線の描画」で1セットにするような感じになるかと思います。

    • 編集済み Ayasam 2011年1月7日 8:32 誤植の修正
    • 回答としてマーク VANLILY 2011年1月7日 10:00
    2011年1月7日 8:30

すべての返信

  • 上記の方法では、例えばフォームが別の画面の下に隠れた場合など、再度上に表示したら

    描画内容が消えませんか?そもそも、ピクチャボックスのOnPaintのe.Graphicsに対して行うべきと思います。

    また、別の手段ということで、MSChartコントロールというものがあります。

    VisualStudio2010であれば標準で、2008以前であってもライブラリをダウンロード出来ます。

    http://www.microsoft.com/downloads/details.aspx?FamilyID=130f7986-bf49-4fe5-9ca8-910ae6ea442c&displaylang=ja

     

    以下にMSChartに関する情報を簡潔にまとめてあります。

    http://www.kanazawa-net.ne.jp/~pmansato/net/net_mschart.htm

    2011年1月7日 2:07
  • もしも WPF を使ってもいいのであれば、Dynamic Data Display というフリーのライブラリを使うと、リアルタイムの折れ線グラフが簡単に実装できます。

     WPF Dynamic Data Display
     http://dynamicdatadisplay.codeplex.com/

    リアルタイム描画のサンプルも入っています。
    試しに CPU 使用率のグラフを実装してみましたことがありますが、プロット用のバッファにデータを入れるだけでした。

    2011年1月7日 3:38
  • このソースで言うと、
    ピクチャボックスのimageプロパティにNULLを代入したことで、ピクチャボックスに表示するものがなくなっているので、
    その後で、そのイメージに対して描画の処理を行っても、何も無いところに描画しているようなもではないかと。
    なので、何も描画されないのかとおもいます。

    表示のクリアを、FillRectangleメソッドなどで描画エリアを塗りつぶすことでクリアしたことにしてはどうでしょう?
    「背景塗りつぶし+線の描画」で1セットにするような感じになるかと思います。

    • 編集済み Ayasam 2011年1月7日 8:32 誤植の修正
    • 回答としてマーク VANLILY 2011年1月7日 10:00
    2011年1月7日 8:30
  • 皆さま、ご返答ありがとうございました。
    いずれすべての方法を検討させていただきますが、今回は追加のライブラリなしで行えるAyasam様の返信を回答としてマークさせていただきました。

    またいずれ、機会がありましたらよろしくお願いします。
    2011年1月7日 10:02