Sistema coordenadas en PictureBox

30/05/2005 - 07:35 por Maria Agustina Paz | Informe spam
Hola. Necesito saber como modificar el sistema de coordenadas por defecto que
tienen los PictureBox del framework .NET para dibujar lineas, puntos,
elipses, etc.
Por defecto el punto 0,0 donde se cruzan los ejes x,y esta en el vertice
arriba a la izquierda del control PictureBox, y el eje Y es positivo hacia
abajo.
Necesito que mi sistema de coordenadas tenga el punto 0,0 en el centro del
PictureBox y el eje Y sea positivo hacia arriba.

En versiones anteriores esto se hacia FACILMENTE con el metodo Scale o con
las
propiedades ScaleTop, ScaleLeft, ScaleHeigh, ScaleWidht, pero no se como
hacer lo mismo en .NET

He intentado hacerlo manipulando el objeto Graphics que se obtiene con el
metodo CreateGraphics del PictureBox, pero no he conseguido hacerlo. Creo que
debe ser muy facil hacerlo pero no consigo darme cuenta.

Saludo y gracias si alguien puede dar una respuesta

Preguntas similare

Leer las respuestas

#1 Tristan
30/05/2005 - 11:02 | Informe spam
En versiones anteriores esto se hacia FACILMENTE con el metodo Scale o con
las
propiedades ScaleTop, ScaleLeft, ScaleHeigh, ScaleWidht, pero no se como
hacer lo mismo en .NET



En realidad, puesto que tu pregunta está en un foro de C#, ten en cuenta que
no hay versiones anteriores de este lenguaje. En todo caso, a lo único a lo
que podriamos llamar versión anterior sería al api win32, o a las MFC. En el
api del GDI de win32 no existen esas propiedades. La forma de trabajo es muy
similar a la del GDI+ de .net.

En .net lo que quieres se haría así:

En el Paint del PictureBox:

e.Graphics.TranslateTransform(PictureBox1.Width / 2, PictureBox1.Height / 2);
e.Graphics.ScaleTransform(1, -1);
e.Graphics.DrawLine(Pens.Red, 0, 0, 0, 100);
e.Graphics.DrawLine(Pens.Blue, 0, 0, 100, 0);

Pero ten en cuenta que al realizar una transformación, todo lo que dibujes
queda afectado. Por ejemplo tras el TransformScale(), todo el texto que
dibujes posteriormente se escribirá volteado hacia abajo.

Por cierto, un detalle importante. Has hablado de CreateGraphics. Este
método tiene poca utilidad en tu caso. Si dibujas un control fuera del evento
de Paint, el dibujo no será persistente. Se borrará en cuanto pongas una
ventana sobre él, o simplemente al minimizar y restaurar. El evento de Paint
te ofrece un graphics en su parámetro "e". Lo que dibujes en Paint si será
persistente.

Es posible dibujar de forma persistente si necesidad de hacer uso del evento
de Paint, pero no es mediante CreateGraphics().

Juan Carlos Badiola Saiz
MVP - C#
Respuesta Responder a este mensaje
#2 Maria Agustina Paz
30/05/2005 - 18:41 | Informe spam
Muchas gracias por tu respuesta:

En realidad, puesto que tu pregunta está en un foro de C#, ten en cuenta que
no hay versiones anteriores de este lenguaje. En todo caso, a lo único a lo
que podriamos llamar versión anterior sería al api win32, o a las MFC. En el
api del GDI de win32 no existen esas propiedades. La forma de trabajo es muy
similar a la del GDI+ de .net.



Si por supuesto, me referia a frameworks o controles que vi por ahi alguna
vez en distintos lenguajes. Lo puse para orientar sobre que estaba hablando
con mas precision, creyendo que hay metodos equivalentes en cualquier
lenguaje.

e.Graphics.TranslateTransform(PictureBox1.Width / 2, PictureBox1.Height / 2);
e.Graphics.ScaleTransform(1, -1);
e.Graphics.DrawLine(Pens.Red, 0, 0, 0, 100);
e.Graphics.DrawLine(Pens.Blue, 0, 0, 100, 0);



Asi es. Descubri esos metodos y despues de toquetear mucho, encontre como
funcionaba la propiedad Transform del Graphics pasandole una matriz de
transformacion.

Por cierto, un detalle importante. Has hablado de CreateGraphics. Este
método tiene poca utilidad en tu caso. Si dibujas un control fuera del evento
de Paint, el dibujo no será persistente. Se borrará en cuanto pongas una
ventana sobre él, o simplemente al minimizar y restaurar. El evento de Paint
te ofrece un graphics en su parámetro "e". Lo que dibujes en Paint si será
persistente.



Si!!! tambien me percate con horror que eso pasaba. Solo para tener una
orientacion de a donde buscar, que debo usar para que los dibujos sean
persistentes sin usar el evento Paint?


Muchas gracias de nuevo, un saludo
Respuesta Responder a este mensaje
#3 Tristan
30/05/2005 - 19:53 | Informe spam
Asi es. Descubri esos metodos y despues de toquetear mucho, encontre como
funcionaba la propiedad Transform del Graphics pasandole una matriz de
transformacion.



Aunque se puede establecer una matriz de transformación, quizá sea más
intuitivo con los dos métodos de mi ejemplo anterior:

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


Si!!! tambien me percate con horror que eso pasaba. Solo para tener una
orientacion de a donde buscar, que debo usar para que los dibujos sean
persistentes sin usar el evento Paint?



En cuanto a lo de la persistencia, si conoces VB, pasa lo mismo con
"AutoRedraw = false". La forma habitual de dibujar en windows es en Paint.
Las ventanas se vuelven a pintar cada vez que se descubren. Autoredraw lo
que hace es guardar la imagen en un buffer que se redibuja automáticamente.
La pega de este sistema es que desperdicia memoria. Siempre que sea posible
debe dibujarse en Paint.

Hay una forma de dibujar en .net casi idéntica al "AutoRedraw = true" de VB.

Creas un objeto Bitmap, lo estableces como imagen del PictureBox (o
cualquier otro control) y dibujas sobre él.

Es decir:

Bitmap imagen = New Bitmap(PictureBox1.Width, PictureBox1.Height);
PictureBox1.Image = imagen;

Graphics lienzo = Graphics.FromImage(imagen);
lienzo.DrawLine(...);
...
lienzo.Dispose();

Los dos primeros pasos de creación y asignación de la imagen solo tienes que
hacerlos la primera vez.

Juan Carlos Badiola
MVP - C#
Respuesta Responder a este mensaje
#4 Maria Agustina Paz
02/06/2005 - 15:56 | Informe spam
Muchas gracias





"Tristan" escribió:

Aunque se puede establecer una matriz de transformación, quizá sea más
intuitivo con los dos métodos de mi ejemplo anterior:

e.Graphics.TranslateTransform(PictureBox1.Width / 2, PictureBox1.Height /
2);
e.Graphics.ScaleTransform(1, -1);
En cuanto a lo de la persistencia, si conoces VB, pasa lo mismo con
"AutoRedraw = false". La forma habitual de dibujar en windows es en Paint.
Las ventanas se vuelven a pintar cada vez que se descubren. Autoredraw lo
que hace es guardar la imagen en un buffer que se redibuja automáticamente.
La pega de este sistema es que desperdicia memoria. Siempre que sea posible
debe dibujarse en Paint.

Hay una forma de dibujar en .net casi idéntica al "AutoRedraw = true" de VB.

Creas un objeto Bitmap, lo estableces como imagen del PictureBox (o
cualquier otro control) y dibujas sobre él.

Es decir:

Bitmap imagen = New Bitmap(PictureBox1.Width, PictureBox1.Height);
PictureBox1.Image = imagen;

Graphics lienzo = Graphics.FromImage(imagen);
lienzo.DrawLine(...);

lienzo.Dispose();

Los dos primeros pasos de creación y asignación de la imagen solo tienes que
hacerlos la primera vez.

Juan Carlos Badiola
MVP - C#
email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida