Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





ayuda con dibujo de lineas en vb 2005

Iniciado por humber, 31 de Mayo de 2007, 06:13:55 AM

« anterior - próximo »

humber

que tal amigos tengo una duda como puedo hacer para que las lineas que hago en un picturebox o en el formulario no se me borren al mostrar mensajes (msgbox())... No se porque sucede esto.....

Epero de su ayuda :)

[EX3]

Cita de: "humber"No se porque sucede esto.....
Esto sucede por que un MsgBox() detiene o pausa la ejecucion del hilo de ejecucion hasta que cierras el dialogo, razon por la que el codigo restante no se ejecuta y por lo que no se realiza el repintado.

Sin hacer muchas chapuzas yo me haria un formulario propio a modo de cuadro de mensaje donde le pusiera un control Timer que se encargue de refrescar el codigo de repintado y lo mostraria de forma modal mediante ShowDialog().

Salu2...
José Miguel Sánchez Fernández
.NET Developer | Game Programmer | Unity Developer

Blog | Game Portfolio | LinkedIn | Twitter | Itch.io | Gamejolt

humber

Pero fijate que cuando muevo un picturebox sobre las lineas que he dibujado tambien se me borra... el picturebox es como si fuera un borrador y no quiero que se me borre... en momento de ejecucion por supuesto...

[EX3]

No se trata del MsgBox si no de que cuando dibujas algo mediante el API grafico de Windows esto se queda impreso en el control que sea pero no es persistente, por lo que cualquier otra operacion de pintado borrara o sobreescribira la existente, cuando mueves el PictureBox este se redibuja en la nueva posicion, por lo que borra lo que tiene debajo. La solucion es redibujar todas las operaciones de dibujo que vayas realizando mediante un Timer o desde el evento Paint del formulario. De esta forma, aunque se hagan otras operaciones de dibujo sobre lo que ya esta dibujado, lo que ya tengas se mantendra. Un ejemplo para que lo entiendas mejor:
Public Class Form1

   Dim Lienzo As Graphics
   Private Lista As New List(Of Point) ' Lista que almacenara todas las posiciones existentes de circunferencias.

   Private Sub Form1_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
       Lienzo.Dispose()
   End Sub

   Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
       Lienzo = Me.CreateGraphics()
   End Sub

   Private Sub Form1_MouseClick(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles MyBase.MouseClick
       DrawCircle(e.Location)
       Lista.Add(e.Location)
   End Sub

   Private Sub Form1_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles Me.Paint
       For Each p As Point In Lista
           DrawCircle(p)
       Next
   End Sub

   Private Sub DrawCircle(ByVal Location As Point)
       ' Dibujamos un circulo relleno
       Lienzo.FillEllipse(Brushes.CadetBlue, Location.X - 10, Location.Y - 10, 20, 20)
       ' Dibujamos un circulo sin relleno
       Lienzo.DrawEllipse(New Pen(Color.Black, 3), Location.X - 10, Location.Y - 10, 20, 20)
   End Sub
End Class

Esto hace que cada vez que se pulse con el raton sobre el area cliente del formulario se dibuje una elipse rellena. Su codigo hace que se refresque el contenido del formulario de forma que se redibujen todas las elipses que se dibujaron cada vez que se lance el evento _Paint del formulario.

Esta es una de varias formas de solventar el problema. Si buscas por la red seguramente encuentres algunas similares o que atajen del problema de una forma mas comoda.

Salu2...
José Miguel Sánchez Fernández
.NET Developer | Game Programmer | Unity Developer

Blog | Game Portfolio | LinkedIn | Twitter | Itch.io | Gamejolt

shephiroth

Buenas.

Tube un problema parecido en mi proyecto de ASI, y me volvi loco redefiniendo mil funciones de redibujado para que el control siempre tuviera pintado lo que yo quisiera. Al final lo tuve que dejar, y quedaba horroroso con flickerin y toda la pesca.

Ahora que veo que estais por un camino similar, os prevengo, PARAD!!!! Existe un metodo mejor y librarse de todo el jaleo de redibujado. Lo que tienes que hacer es añadirte un objeto Image al formulario. En el metodo Load crear esa imagen del mismo tamaño del control, y dibujar sobre el lo que necesites. Una vez dibujado el pasas el objeto Image al control, y te desentiendes.

Si necesitas cambiar el contenido, tratalo como un contexto grafico.....creas nueva imagen de tamaño del boton, sobre ella dibujas todo el control, y se lo vuelves a pasar al control para que se encargue el.

SUERTE!!

humber

Muchas gracias por la información... Si pueden coloquen el archivo Xfa pues yo estoy iniciando y no comprendí a la perfeccion algunas cosas... Gracias...

shephiroth

Buenas. No utilizo vb asi que quizas los nombres de los objetos cambien, pero creo que la idea se ve:


//cuando queramos cambiar el dibujo del boton hacemos
Image aux = new Image(boton.getWidth(), boton.getHeight());
Graphics g = aux.getGraphics();
g.drawXXX(....);
boton.setBackground(aux);

humber

si en el .net estoy trabajando para ser especificos en el 2005.... Ese codigo es para cambiar la imagen del boton??

ahi les dejo el ejecutable para que vean cual es el problema... nota: tienen que tener el framework2 (ya viene incluido con visual .net)

http://rapidshare.com/files/37845823/dibujar.rar.html






Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
Muchísimas gracias.