en un UserControl tengo un PictureBox y algunos otros controles. Para el control de usuario que contiene este picturebox nombrado como Graph tengo un método para dibujar una curva en este cuadro de imagen:

    //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();
    }

Cuando se inicia la aplicación, el eje se dibujan. pero cuando me llaman la DrawData método tengo la excepción que dice bmp es nulo. ¿Cuál puede ser el problema?

También quiero ser capaz de llamar a DrawData varias veces para mostrar múltiples curvas cuando el usuario hace clic en algunos botones. ¿Cuál es la mejor manera de lograr esto?

Gracias

1 Comentario

  1. 5

    Nunca asignados Image, ¿verdad? Si quieres dibujar en un PictureBox‘ imagen que usted necesita para crear esta imagen primero, mediante la asignación de un mapa de bits con las dimensiones de la PictureBox:

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

    Usted sólo necesita hacer esto una vez, la imagen se puede reutilizar si desea volver a dibujar lo que hay.

    Puede posteriormente utilizar esta imagen para dibujo. Para obtener más información, consulte la documentación.

    Por el camino, esto es totalmente independiente de dibujo en la PictureBox en el Paint controlador de eventos. Este último se basa en el control directamente, mientras que el Image sirve como un backbuffer que está pintado en el control automáticamente (pero hacer necesidad de invocar Invalidate para desencadenar un rediseño, después de dibujar en el backbuffer).

    Además, se hace no sentido para volver a asignar el mapa de bits a la PictureBox.Image de la propiedad después de dibujar. La operación no tiene sentido.

    Algo más, ya que el Graphics objeto es desechable, se debe poner en un using bloque en lugar de deshacerse de él de forma manual. Esto garantiza la correcta eliminación en la cara de excepciones:

    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.
    }

    Usted debe considerar esto como un patrón fijo.

    • No, yo no asignar, yo estaba thinkning llamar método Paint en el gráfico de la imagen. ¿Puedes explicar un poco más por favor, ¿cómo solucionar el problema?
    • Ver la actualización.
    • muchas gracias.

Dejar respuesta

Please enter your comment!
Please enter your name here