2009-08-19 7 views
2

winformsでプロットした経験はありませんが、私はecgをプロットする必要があります。または特定の領域でsin波や波動関数を言うことができますが、私がやっていることはecgです。フォームの残りの部分は、ボタンやラベルのある通常のフォームになりますWinformsでECGをプロットする

誰でもチュートリアル

:)

答えて

2

あなたはいくつかの選択肢を持っている、あなたは、データを処理し、それをレンダリングすること、独自のコントロールを作成することができます。より複雑なプロットの場合、少し複雑になることがありますが、基本は常に同じで、XとYの値の範囲を設定し、GDIを使って左から右へ線を描画します。
これは、より高度な機能のために少し複雑になる可能性があるので、私はthisの投稿を読むか、codeproject.comをチェックして、いくつかのチャーティングコントロールを使用することができました。オープンソースでは、新しい記事はおそらくWPFでコード化されますが、古いものも見つかるはずです。
編集:
あなたが便利見つけることができますいくつかのリンク:Graph plotting lib that's main goal is to simulate ECGanother graph plotting lib

+0

おかげでたくさん:) – Moon

1

あなたはカスタムコントロールを作成する必要があります。

public class MyECGDrawer : Control{} 

それは、あなたが次にペイント機能で、あなたのグラフィックあなたがそれを望むように描くのOnPaintイベント

protect override OnPaint(PaintEventArgs pe){} 

を上書きする、のは罪(x)は

// refresh background 
pe.Graphics.FillRectangle(Brushes.White, 0, 0, Width, Height); 
int prevX = -1, prevY = -1; 
for(int x = 0; x < Width; x++) 
{ 
    if(prevX >= 0) 
    { 
     pe.Graphics.DrawLine(Pens.Black, prevX, prevY, x, Math.sin(x)); 
    } 
    prevX = x; 
    prevY = Math.sin(x); 
} 
をしましょう

ECGを強制的に再描画するには、コントロールの.Invalidate()関数を呼び出します。フォーム内のコントロールをデザイナーからドラッグアンドドロップできるはずです。

最後に

、クラスが

パブリッククラスMyECGDrawerのようになります。あなたはこれをやっている場合を除きコントロール{}これで

を、あなたはOnPaintイベント

public class MyECGDrawer : Control 
{ 
protect override OnPaint(PaintEventArgs pe) 
{ 
    // refresh background 
    pe.Graphics.FillRectangle(Brushes.White, 0, 0, Width, Height); 
    int prevX = -1, prevY = -1; 
    for(int x = 0; x < Width; x++) 
    { 
     if(prevX >= 0) 
      pe.Graphics.DrawLine(Pens.Black, prevX, prevY, x, Math.sin(x)); 
     prevX = x; 
     prevY = Math.sin(x); 
    } 
} 
} 
+0

おかげでたくさん:) – Moon

0

を上書き無料のMicrosoft Chart Controls for .NETをご覧になることをお勧めします。あなたがあなた自身をロールバックしたい場合は言われて、私は次のガイドラインを提供することを

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

  1. フォームに直接描画するのではなく、プロットの描画をカプセル化するユーザーコントロールを作成します。
  2. レンダリングするデータを取得/設定するプロパティを公開し、レンダリングを制御するその他のプロパティ(スケーリング、パン、色など)を追加します。
  3. コントロールでは、 OnPaintメソッドを使用するか、Paintイベントのイベントハンドラを作成します。これらのメソッドには、PaintEventArgsオブジェクトが渡されます.PaintEventArgsオブジェクトには、Graphicsオブジェクトがプロパティとして格納されます。 Graphicsオブジェクトのメソッドは、描画する必要があるときにポイント、ラインなどをコントロールにレンダリングするために使用されます。描画操作のほとんどは、ペン(アウトライン/ライン)またはブラシ(塗りつぶしエリア)のいずれかを必要とします。これらの操作には在庫オブジェクトを使用することができます(Pens.BlackやBrushes.Redなど)。独自のオブジェクトを作成することもできます(ドキュメントを参照)。独自のオブジェクトを作成する場合は、オブジェクトを使用した後にオブジェクトを廃棄してください(例:「using」ステートメントを使用するかDisposeを呼び出すなど)。

GDI +に関するいくつかの良い本があります。あなたが深く入っているなら、1つを選ぶことをお勧めします。

+0

おかげでたくさん:) – Moon

1

私は以下を書いてテストしました。それは、あなたが望むことをしているようですが、遅延なしでsin(x)をプロットするだけです。つまり、sin(x)のプロットは左端から非常に速く見えないからです。ただし、ループ内の任意の行にブレークを入れ、F5キーを押しながらループを進めてゆっくりと動作させることができます。ストリーミングECGデータは一定のスピードでしか到達しないため、実装上問題はありません。

以下では、monitorはwinformsフォームのPictureBoxです。それ以外はすべてローカルです。

private void drawStream(){ 
    const int scaleX = 40; 
    const int scaleY = 40; 
    Point monitorTopLeft = new Point(0, 0); 
    Point MonitorTopLeftMinus1 = new Point(-1, 0); 

    int halfX = monitor.Width/2; 
    int halfY = monitor.Height/2; 
    Size size = new Size(halfX + 20, monitor.Height); 

    Graphics g = monitor.CreateGraphics(); 
    g.TranslateTransform(halfX, halfY); 
    g.ScaleTransform(scaleX, scaleY); 
    g.Clear(Color.Black); 
    g.ResetClip(); 

    float lastY = (float)Math.Sin(0); 
    float y = lastY; 
    Pen p = new Pen(Color.White, 0.01F); 
    float stepX = 1F/scaleX; 

    for (float x = 0; x < 10; x += stepX) { 
    g.CopyFromScreen(monitor.PointToScreen(monitorTopLeft), MonitorTopLeftMinus1, size, CopyPixelOperation.SourceCopy); 
    y = (float)Math.Sin(x); 
    g.DrawLine(p, -stepX, lastY, 0, y); 
    lastY = y; 
    } 
} 

役立つかもしれないいくつかの追加情報:

  1. 起源ピクチャボックス内には、左上隅に を開始します。 TranslateTransformを使用すると、 の原点を平行移動(移動)できます。 この例では、 ピクチャボックスの幅の半分を翻訳し、その高さの半分は です。
  2. ScaleTransformはピクチャボックスの倍率を変更します。ピクチャボックスに描画するために使用するペンの幅をさらに拡大することに注意してください。ペンの幅は0.01に設定されています。
  3. CopyFromScreenはbitbltを実行します。そのソースポイントはスクリーンに関連し、デスティネーションはピクチャボックスに関連し、移動する長方形のサイズは変換を無視します(追加したスケール変換や変換変換など)。
  4. DrawLineメソッドのX座標は-stepxと0であることに注意してください。すべての描画は基本的にy軸(つまりx = 0)の右側で行われ、次にCopyFromScreenは描画された部分を左に移動して "左に。
+0

@クリス裁判官:US ECGの最も25ミリメートル/秒であり、海外のあなたが得ることができる50ミリメートル/秒(または心臓ICUやテレメトリで米国のフロア)。だから、もしあなたが約10ms(おそらく40-50ms)の睡眠を入れたら、96dpiを仮定しておおよその速度になります。 – user7116

関連する問題