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

#6 Aitziber
19/10/2007 - 12:05 | Informe spam
No lo he entendido muy bien.
A mi me van llegando mensajes, de poner en el form lineas, espacios, label,
textbox, combobox,...

Entonces como lo hago??

Ademas los label y todo eso son clases de componentes que yo he creado.

Si me podríais dar un ejemplo os lo agradeceria




"Alberto Poblacion"
escribió en el mensaje news:
"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
#7 Alberto Poblacion
19/10/2007 - 13:00 | Informe spam
"Aitziber" wrote in message
news:%
No lo he entendido muy bien.
A mi me van llegando mensajes, de poner en el form lineas, espacios,
label, textbox, combobox,...



Las dos cosas se hacen por separado. Los label, textbox, combobox, etc.,
los puedes pintar cuando quieras y olvidarte de ellos porque el propio
sistema ya los almacena y los pinta y repinta cuando sea necesario. Pero con
los dibujos del form no pasa lo mismo: Cada vez que windows coloca algo
encima del form (un popup), se le olvida todo lo que había pintado, y
entonces "llama" a tu programa para decirle que lo vuelva a pintar. Por eso
el programa necesita tener guardado en algún sitio todo lo que hay que
pintar en pantalla para volver a pintarlo cuando se dispare el evento Paint.

Entonces como lo hago??



1) Cuando te llega un mensaje, pintas los label, textbox, etc., y además
guardas en un array la información necesaria para saber qué lineas tienes
que dibujar, y llamas a this.Invalidate().

2) En el evento Paint, pintas todas las lineas que sean necesarias conforme
con lo que previamente guardaste en el array durante el paso 1.

Usualmente (2) ocurrirá inmediatamente después de (1), gracias al
Invalidate(), pero ocasionalmente (2) se disparará sin que hayas recibido
nada, cuando haya ocurrido algo en pantalla que te haya tapado parte del
form.
Respuesta Responder a este mensaje
#8 Aitziber
22/10/2007 - 10:07 | Informe spam
Podriais poner algun ejemplo??





"RFOG" escribió en el mensaje
news:
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
#9 Aitziber
22/10/2007 - 12:10 | Informe spam
GRACIAS. CONSEGUIDO!!!


"Aitziber" escribió en el mensaje
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;


email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una pregunta AnteriorRespuesta Tengo una respuesta
Search Busqueda sugerida