error al dibujar una linea en un form

19/10/2007 - 10:24 por Aitziber | Informe spam
Hola,
estoy intentando crear una linea en un form de una pda.
Yo lo hago tan sencillo como esto pero no se porque la verdad es que no me
las dibuja.
Esto es lo que hago, si alguien me puede ayudar:

x = this.Width;

System.Drawing.Pen myPen;

myPen = new System.Drawing.Pen(System.Drawing.Color.Black, 5);

System.Drawing.Graphics formGraphics = this.CreateGraphics();

formGraphics.DrawLine(myPen, 0, posicion_Y, x, posicion_Y);


myPen.Dispose();

formGraphics.Dispose();




posicion_Y += 10;

Preguntas similare

Leer las respuestas

#1 Alberto Poblacion
19/10/2007 - 10:39 | Informe spam
El dibujo sobre un form realmente lo deberías hacer únicamente durante el
evento Paint del form, que el sistema invoca cada vez que por alguna razón
se le "borra" el form (por ejemplo, si sale un popup por encima).
En este evento, ya te llega un PaintEventArgs que dentro contiene una
referencia al objeto Graphics que tienes que usar, por lo que nunca
necesitas llamar al CreateGraphics para pintar sobre el form. Prueba a
hacerlo asi, a ver si te funciona.


"Aitziber" wrote in message
news:
Hola,
estoy intentando crear una linea en un form de una pda.
Yo lo hago tan sencillo como esto pero no se porque la verdad es que no me
las dibuja.
Esto es lo que hago, si alguien me puede ayudar:

x = this.Width;

System.Drawing.Pen myPen;

myPen = new System.Drawing.Pen(System.Drawing.Color.Black, 5);

System.Drawing.Graphics formGraphics = this.CreateGraphics();

formGraphics.DrawLine(myPen, 0, posicion_Y, x, posicion_Y);


myPen.Dispose();

formGraphics.Dispose();




posicion_Y += 10;


Respuesta Responder a este mensaje
#2 RFOG
19/10/2007 - 10:42 | Informe spam
En Fri, 19 Oct 2007 10:24:07 +0200, Aitziber escribió:

Hola,
estoy intentando crear una linea en un form de una pda.
Yo lo hago tan sencillo como esto pero no se porque la verdad es que no
me
las dibuja.
Esto es lo que hago, si alguien me puede ayudar:

x = this.Width;

System.Drawing.Pen myPen;

myPen = new System.Drawing.Pen(System.Drawing.Color.Black, 5);

System.Drawing.Graphics formGraphics = this.CreateGraphics();

formGraphics.DrawLine(myPen, 0, posicion_Y, x, posicion_Y);


myPen.Dispose();

formGraphics.Dispose();




posicion_Y += 10;





¿Lo estás haciendo en el evento Paint de la ficha, usando el Graphics que
te da el propio evento? Veo que no, ahí debe estar el problema. No puedes
pintar donde quieras, tienes que pintar en el evento paint, y sólo tras
una llamada a Invalidate, y sólo en el área que el invalidate -o el
sistema- haya invalidado. Lo demás es ignorado.

Por lo menos este es comportamiento "canónico" y el que se debe usar:
concentra todo el pintado en el evento Paint de la ficha o del componente.



Microsoft Visual C++ MVP
==Visita mi blog principal: http://rfog.blogsome.com
Y este sobre programación: http://geeks.ms/blogs/rfog
Libros, ciencia ficción y programación
La verdadera energía y el verdadero caracter son como el valor, tranquilo
y moderado, sin alardes y sin vacilaciones.
Respuesta Responder a este mensaje
#3 Aitziber
19/10/2007 - 11:05 | Informe spam
Haber la cosa es que yo dibujo la linea cuando me llega un mensaje para así
hacerlo. (del puerto).
Entonces lo hago en una funcion sin mas.





"RFOG" escribió en el mensaje
news:
En Fri, 19 Oct 2007 10:24:07 +0200, Aitziber
escribió:

Hola,
estoy intentando crear una linea en un form de una pda.
Yo lo hago tan sencillo como esto pero no se porque la verdad es que no
me
las dibuja.
Esto es lo que hago, si alguien me puede ayudar:

x = this.Width;

System.Drawing.Pen myPen;

myPen = new System.Drawing.Pen(System.Drawing.Color.Black, 5);

System.Drawing.Graphics formGraphics = this.CreateGraphics();

formGraphics.DrawLine(myPen, 0, posicion_Y, x, posicion_Y);


myPen.Dispose();

formGraphics.Dispose();




posicion_Y += 10;





¿Lo estás haciendo en el evento Paint de la ficha, usando el Graphics que
te da el propio evento? Veo que no, ahí debe estar el problema. No puedes
pintar donde quieras, tienes que pintar en el evento paint, y sólo tras
una llamada a Invalidate, y sólo en el área que el invalidate -o el
sistema- haya invalidado. Lo demás es ignorado.

Por lo menos este es comportamiento "canónico" y el que se debe usar:
concentra todo el pintado en el evento Paint de la ficha o del componente.



Microsoft Visual C++ MVP
==> Visita mi blog principal: http://rfog.blogsome.com
Y este sobre programación: http://geeks.ms/blogs/rfog
Libros, ciencia ficción y programación
> La verdadera energía y el verdadero caracter son como el valor, tranquilo
y moderado, sin alardes y sin vacilaciones.
Respuesta Responder a este mensaje
#4 Alberto Poblacion
19/10/2007 - 11:49 | Informe spam
"Aitziber" wrote in message
news:%
Haber la cosa es que yo dibujo la linea cuando me llega un mensaje para
así hacerlo. (del puerto).
Entonces lo hago en una funcion sin mas.



Bien, pues hay que cambiarlo asi:

En la función, guardas los datos que te han llegado del puerto en variables
de clase, y no pintas nada, sino que llamas al método Invalidate() del Form.
Esto hace que se dispare el evento Paint.
En el evento, lees todos los datos que tienes salvados en las variables de
clase y vuelves a pintar con ellos todo el form.
Respuesta Responder a este mensaje
#5 RFOG
19/10/2007 - 11:54 | Informe spam
Pues así no es como se hace.

Tienes que definirte una estructura de datos que te permita en el evento
Paint repintar todo lo necesario. Así, pese al inconveniente de complicar
un poco el programa, tienes la ventaja de que éste va a ir mejor, ya que
las rutinas de pintado ocupan mucho tiempo.

¿Qué pasa si recibes dos comandos de puerto serie lo suficientemente
seguidos que no te de tiempo a pintar? Mientras el componente tenga
buffer, bien, pero cuando se llene, perderás datos, y encima la aplicación
irá loca atendiendo al evento o al timer que atiende al puerto serie.

Comforme te hemos dicho, tu tienes un array de vectores (que son las
líneas), añades un elemento y llamas a Invalidate con loas coordenadas de
la propia línea. Ya estás libre. SI se acumulan Invalidates y eventos
Paint no pasa nada, windows sabe qué hacer juntando Paints e Invalidates
en un mismo mensaje.


En Fri, 19 Oct 2007 11:05:55 +0200, Aitziber escribió:

Haber la cosa es que yo dibujo la linea cuando me llega un mensaje para
así
hacerlo. (del puerto).
Entonces lo hago en una funcion sin mas.





"RFOG" escribió en el mensaje
news:
En Fri, 19 Oct 2007 10:24:07 +0200, Aitziber
escribió:

Hola,
estoy intentando crear una linea en un form de una pda.
Yo lo hago tan sencillo como esto pero no se porque la verdad es que no
me
las dibuja.
Esto es lo que hago, si alguien me puede ayudar:

x = this.Width;

System.Drawing.Pen myPen;

myPen = new System.Drawing.Pen(System.Drawing.Color.Black, 5);

System.Drawing.Graphics formGraphics = this.CreateGraphics();

formGraphics.DrawLine(myPen, 0, posicion_Y, x, posicion_Y);


myPen.Dispose();

formGraphics.Dispose();




posicion_Y += 10;





¿Lo estás haciendo en el evento Paint de la ficha, usando el Graphics
que
te da el propio evento? Veo que no, ahí debe estar el problema. No
puedes
pintar donde quieras, tienes que pintar en el evento paint, y sólo tras
una llamada a Invalidate, y sólo en el área que el invalidate -o el
sistema- haya invalidado. Lo demás es ignorado.

Por lo menos este es comportamiento "canónico" y el que se debe usar:
concentra todo el pintado en el evento Paint de la ficha o del
componente.



Microsoft Visual C++ MVP
==>> Visita mi blog principal: http://rfog.blogsome.com
Y este sobre programación: http://geeks.ms/blogs/rfog
Libros, ciencia ficción y programación
>> La verdadera energía y el verdadero caracter son como el valor,
tranquilo
y moderado, sin alardes y sin vacilaciones.









Microsoft Visual C++ MVP
==Visita mi blog principal: http://rfog.blogsome.com
Y este sobre programación: http://geeks.ms/blogs/rfog
Libros, ciencia ficción y programación
La verdadera energía y el verdadero caracter son como el valor, tranquilo
y moderado, sin alardes y sin vacilaciones.
Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente Respuesta Tengo una respuesta
Search Busqueda sugerida