none
Hacer persistente sistema de coordenadas en PictureBox RRS feed

  • Pregunta

  • hola, bueno en un PictureBox en su evento Paint implemente este codigo: 

           
    e.Graphics.TranslateTransform(pictureBox1.Width / 2, pictureBox1.Height / 2);
    e.Graphics.ScaleTransform(1, -1); 
    e.Graphics.DrawLine(Pens.Black, 0, 0, 0, 200); 
    e.Graphics.DrawLine(Pens.Black, 0, 0, 200, 0);
    e.Graphics.DrawLine(Pens.Black, -200, 0, 0, 0);
    e.Graphics.DrawLine(Pens.Black, 0,-200, 0, 0);
    

    Y lo que hace es que me dibuja los ejes xy haciendo alusion a un sistema de coordenadas(plano cartesiano).

    Pero tengo un boton que al presionarlo me "limpia" lo que hay en el pictureBox, es asi:

    Graphics g = pictureBox1.CreateGraphics();
    g.Clear(Color.White);          
    label3.Text = "";          
    Lista.Clear();           
    textBox1.Clear();

    Y vaya que si quiero que me limpie el pictureBox, pero únicamente cuando uso "g". Mas sin embargo "g" limpia todo el pictureBox y yo tenia entendido que al poner el sistema de coordenadas en paint, este era persistente, pero no.

    como es que puedo hacer para que lo que puse de código en el evento Paint, no se borre al momento de pulsar el botónlimpiar?

    NOTA: Con bitmap me arruinaría todo el demás código que ya tengo establecido, así que bitmap no es una opción.

    miércoles, 4 de noviembre de 2020 4:58

Respuestas

  • Hola Brenda

    Lo que podes hacer es que al limpiar el PictureBox se ejecute el método del evento Paint, así se dibuja de nuevo lo que había antes, con:

    pictureBox1.Invalidate();

    Saludos

    Pablo


    • Marcado como respuesta BrendaCap jueves, 5 de noviembre de 2020 22:19
    miércoles, 4 de noviembre de 2020 12:26

Todas las respuestas

  • Hola Brenda

    Lo que podes hacer es que al limpiar el PictureBox se ejecute el método del evento Paint, así se dibuja de nuevo lo que había antes, con:

    pictureBox1.Invalidate();

    Saludos

    Pablo


    • Marcado como respuesta BrendaCap jueves, 5 de noviembre de 2020 22:19
    miércoles, 4 de noviembre de 2020 12:26
  • Hola BrendaCap, 

      

    ¿Alguna novedad sobre la consulta realizada? ¿Han sido útiles las  respuestas proporcionadas?  

    Espero su respuesta.  

    Gracias por usar los foros de MSDN.  

    Andres Aguilar 

    ____________________________  

     

    Por favor recuerde "Marcar como respuesta" las respuestas que hayan resuelto su problema, es una forma común de reconocer a aquellos que han ayudado, y hace que sea más fácil para los otros visitantes encontrar la solución más tarde.

    Si tiene algún cumplido o reclamo sobre el soporte de MSDN sientase en la libertad de contactar  MSDNFSF@microsoft.com. 

    miércoles, 4 de noviembre de 2020 17:32
    Moderador
  • Hola y Gracias pablo!!

    Si no es mucha molestia, sabes como puedo cambiar el origen de coordenadas del pictureBox, al centro? Ya ves que el 0,0 del pictureBox se encuentra en la esquina superior izquierda, y pues yo quiero que el origen 0,0 se situe en el centro del pictureBox

    miércoles, 4 de noviembre de 2020 21:49
  • Hola Brenda

    Lo que sospechaba y lo acabo de confirmar: como lo hiciste lo que mostraste en el primer mensaje, que de hecho dibujas los 4 semiejes del plano cartesiano perfectamente adaptados a que el origen 0,0 es el centro del PictureBox.

    Quizás el problema se produce (ahora caigo) si ejecutas una segunda vez (o más) las 2 primeras lineas que son quienes aplican la transformación y la traslación. Lo que yo haría es colocar esas 2 primeras lineas en el método del evento Load, así se ejecutan sólo una vez, y luego no hay más traslaciones ni transformaciones sobre lo ya hecho cuando se produce el Click del botón Limpiar. 

    Después de esto, podes probar, por ejemplo, dibujar figuras que contengan el punto 0,0, y verás que tocan el origen en el centro. 

    Saludos

    miércoles, 4 de noviembre de 2020 23:09
  • Exactamente en donde tengo que poner esas líneas? Porque si es en el evento load de la forma, no funciona. Y cuando uso los eventos LoadCompleted y LoadProgressChanged pertenecientes al PictureBox y les pongo igual esas líneas: 

    e.Graphics.TranslateTransform(pictureBox1.Width / 2, pictureBox1.Height / 2);  
    e.Graphics.ScaleTransform(1, -1);

    Me marca error en la palabra "Graphics". 

    miércoles, 4 de noviembre de 2020 23:42
  • Perdón, no me di cuenta de advertirte. En el método del evento Paint, tenes "a mano" el objeto Graphics del PictureBox a través del parámetro e. Cuando no tenes eso, simplemente creas una referencia al objeto Graphics del PictureBox así:

    Graphics g = pictureBox1.CreateGraphics();

    y luego las lineas

    g.TranslateTransform(pictureBox1.Width / 2, pictureBox1.Height / 2);  
    g.ScaleTransform(1, -1);

    que van en el método del evento Load del Form, para que se ejecuten sólo una vez.

    • Marcado como respuesta BrendaCap jueves, 5 de noviembre de 2020 22:19
    • Desmarcado como respuesta BrendaCap jueves, 5 de noviembre de 2020 22:19
    miércoles, 4 de noviembre de 2020 23:56
  • Ya lo hice tal cual me indicaste, asi quedo: 

    private void Form1_Load(object sender, EventArgs e)        
    {            
    Graphics g = pictureBox1.CreateGraphics(); 
    g.TranslateTransform(pictureBox1.Width / 2, pictureBox1.Height / 2);            
    g.ScaleTransform(1, -1);       
     }
                

    private void PB_Paint(object sender, PaintEventArgs e)  
    {           
    e.Graphics.DrawLine(Pens.Black, 0, 0, 0, 200); 
    e.Graphics.DrawLine(Pens.Black, 0, 0, 200, 0); 
    e.Graphics.DrawLine(Pens.Black, -200, 0, 0, 0);
    e.Graphics.DrawLine(Pens.Black, 0, -200, 0, 0);        
    }

    Pero solo me muestra las líneas dibujadas pegadas al pictureBox, no se si me explique...

    jueves, 5 de noviembre de 2020 0:13
  • Hola

    Sin querer, me engañaste. Estaba perfecto como lo tenías al principio, porque cada vez que se ejecuta el método del evento Paint aparentemente se crea una nueva instancia del objeto en e.Graphics, y entonces tenes que aplicarle TranslateTransform(), pero como me dijiste que algo iba mal, imaginé cosas erróneas, por ejemplo, si en el método del evento Load creas una instancia de Graphics como variable local, luego al terminar el método esta deja de existir, y entonces no queda el nuevo origen en el PictureBox. 

    Resumen: Estaba bien como lo mostraste al principio. De hecho yo hice un ejemplo para mi, y comprobé, que no se hace una segunda traslación o transformación al ejecutar otra vez el método del evento Paint, y la figura que dibujé con todos los X;Y positivos siempre se ve, como es de esperar, en el primer cuadrante (donde x es positivo e y también). 

    jueves, 5 de noviembre de 2020 0:45
  • Pero el cuadrante del pictureBox que viene como predeterminado es siempre el cuarto, entonces como es el cuarto cuadrante, el origen (0,0) lo toma de la esquina superior izquierda y eso es lo q yo quiero modificar, que el (0,0) este al centro del pictureBox. y este código:

    g.TranslateTransform(pictureBox1.Width / 2, pictureBox1.Height / 2);            
    g.ScaleTransform(1, -1);  

    solo sirve como guía para dibujar las líneas al pictureBox, espero no haberte confundido..

    jueves, 5 de noviembre de 2020 0:58
  • Si, entiendo, como te decía, estaba perfecto como lo tenías al principio, en el método del evento Paint

    e.Graphics.TranslateTransform(pictureBox1.Width / 2, pictureBox1.Height / 2);
    e.Graphics.ScaleTransform(1, -1); 
    e.Graphics.DrawLine(Pens.Black, 0, 0, 0, 200); 
    e.Graphics.DrawLine(Pens.Black, 0, 0, 200, 0);
    e.Graphics.DrawLine(Pens.Black, -200, 0, 0, 0);
    e.Graphics.DrawLine(Pens.Black, 0,-200, 0, 0);

    En este mismo método podes dibujar más todo lo que quieras, y se respetará el nuevo sistema de coordenadas.

    Lo del Load sacalo, no sirve.

    Si queres probar que el origen 0,0 está en el centro del PictureBox, dibuja un polígono con sus coordenadas todas positivas, y vas a ver que se dibuja en el primer cuadrante (arriba a la derecha, donde x e y son positivas), y dibuja un polígono con sus coordenadas todas negativas, y vas a ver que se dibuja en el tercer cuadrante (abajo a la izquierda, donde x e y son negativas), y lo mismo para el segundo y el cuarto cuadrante, que alternan.

    jueves, 5 de noviembre de 2020 1:52
  • Hola BrendaCap, 

      

    ¿Alguna novedad sobre la consulta realizada? ¿Han sido útiles las  respuestas proporcionadas?  

    Solo una consulta por hilo. 

    Gracias por usar los foros de MSDN.  

    Andres Aguilar 

    ____________________________  

     

    Por favor recuerde "Marcar como respuesta" las respuestas que hayan resuelto su problema, es una forma común de reconocer a aquellos que han ayudado, y hace que sea más fácil para los otros visitantes encontrar la solución más tarde.

    Si tiene algún cumplido o reclamo sobre el soporte de MSDN sientase en la libertad de contactar  MSDNFSF@microsoft.com. 

    jueves, 5 de noviembre de 2020 18:26
    Moderador