1

UserControl私はとPictureBox他のいくつかのコントロールを持っています。Graphこの画像ボックスに曲線を描く方法があるので、この画像ボックスを含むユーザーコントロールの場合:

    //Method to draw X and Y axis on the graph
    private bool DrawAxis(PaintEventArgs e)
    {
        var g = e.Graphics;
        g.DrawLine(_penAxisMain, (float)(Graph.Bounds.Width / 2), 0, (float)(Graph.Bounds.Width / 2), (float)Bounds.Height);
        g.DrawLine(_penAxisMain, 0, (float)(Graph.Bounds.Height / 2), Graph.Bounds.Width, (float)(Graph.Bounds.Height / 2));

        return true;
    }

    //Painting the Graph
    private void Graph_Paint(object sender, PaintEventArgs e)
    {
        base.OnPaint(e);
        DrawAxis(e);
     }

    //Public method to draw curve on picturebox
    public void DrawData(PointF[] points)
    {
        var bmp = Graph.Image;
        var g = Graphics.FromImage(bmp);

        g.DrawCurve(_penAxisMain, points);

        Graph.Image = bmp;
        g.Dispose();
    }

アプリケーションが起動すると、軸が描画されます。しかし、メソッドを呼び出すと、nullDrawDataという例外が発生します。bmp何が問題になる可能性がありますか?

DrawDataまた、ユーザーがいくつかのボタンをクリックしたときに複数の曲線を表示するために、複数回呼び出すことができるようにしたいと思います。これを達成するための最良の方法は何ですか?

ありがとう

4

1 に答える 1

5

を割り当てたことはありませんImageよね?' 画像に描画する場合は、PictureBox の寸法をビットマップに割り当てて、最初にこの画像を作成PictureBoxする必要があります。

Graph.Image = new System.Drawing.Bitmap(Graph.Width, Graph.Height);

これを行う必要があるのは一度だけです。そこにあるものを再描画したい場合は、画像を再利用できます。

その後、このイメージを描画に使用できます。詳細については、ドキュメントを参照してください

ところで、これはイベント ハンドラPictureBoxでの描画とは完全に独立しています。Paint後者はコントロールに直接描画しImageますが、 はコントロールに自動的に描画されるバックバッファーとして機能します (ただし、バックバッファーに描画した後、再描画をトリガーするために呼び出す必要があります)。Invalidate

さらに、描画後にビットマップをプロパティに再割り当てしても意味がありません。PictureBox.Image操作は無意味です。

オブジェクトは使い捨てであるため、手動で破棄するのではなくGraphics、ブロックに入れる必要があります。usingこれにより、例外が発生した場合の正しい破棄が保証されます。

public void DrawData(PointF[] points)
{
    var bmp = Graph.Image;
    using(var g = Graphics.FromImage(bmp)) {
        // Probably necessary for you:
        g.Clear();
        g.DrawCurve(_penAxisMain, points);
    }

    Graph.Invalidate(); // Trigger redraw of the control.
}

これは固定パターンと考える必要があります。

于 2012-07-18T10:19:18.900 に答える