Autredraw en VB.Net

06/07/2005 - 21:48 por Lordvara | Informe spam
Que tal, estoy desarrollando un control y me encontrq conque la
propiedad autoredraw ya no existe en VB.Net, mi control dibuja en si
mismo una rejilla o grid de 16x16 en todo lo ancho y alto despues de
realizar el redimensionamiento del control.

En tiempo de diseño y ejecucion me pasa que no se actualiza o redibuja
automaticamente y aparecen lineas que no debieran de existir.

como hago para que el comportamiento de mi control sea el adecuado.

Espero sus respuestas. y gracias de antemano.

Saludos.

Preguntas similare

Leer las respuestas

#1 Tristan
06/07/2005 - 21:56 | Informe spam
Lordvara, hoy he respondido a eso dos mensajes más abajo del tuyo. Mira un
mensaje que tiene de asunto "background Image"

Creo que el hecho de que no exista AutoRedraw no cambia nada. Tanto en vb6
como en todo windows como en .net, se DEBE pintar en el evento de Paint.
Pero si decides no hacerlo existe un equivalente al Autoredraw que describo
en ese mensaje.

Juan Carlos Badiola
MVP - C#
Respuesta Responder a este mensaje
#2 Lordvara
06/07/2005 - 22:11 | Informe spam
por ese lado del evento paint estoy bien, si dibujo por medio de este
evento pero por decir cuando hago un redimensionamiento del control en
tiempo de diseño aparecen lineas horizontales y verticales que el
evento paint no contiene.

Aqui mi codigo que lo cambie ahora de Paint a onPaint se comporta de la
misma manera.

Protected Overrides Sub OnPaint(ByVal e As
System.Windows.Forms.PaintEventArgs)
Dim i As Integer

For i = 0 To m_GridHeight
e.Graphics.DrawLine(Pens.Black, 0, CType((Me.Height - 1) /
m_GridHeight, Integer) * i, Me.Width, CType((Me.Height - 1) /
m_GridHeight, Integer) * i)
Next

For i = 0 To m_GridWidth
e.Graphics.DrawLine(Pens.Black, CType((Me.Width - 1) / m_GridWidth,
Integer) * i, 0, CType((Me.Width - 1) / m_GridWidth, Integer) * i,
Me.Height)
Next

e.Graphics.DrawRectangle(Pens.Black, e.ClipRectangle.X,
e.ClipRectangle.Y, e.ClipRectangle.Width - 1, e.ClipRectangle.Height -
1)

Me.Width = CType((Me.Width - 1) / m_GridWidth, Integer) * m_GridWidth
Me.Height = CType((Me.Height - 1) / m_GridHeight, Integer) *
m_GridHeight
End Sub
Respuesta Responder a este mensaje
#3 Lordvara
06/07/2005 - 22:11 | Informe spam
por ese lado del evento paint estoy bien, si dibujo por medio de este
evento pero por decir cuando hago un redimensionamiento del control en
tiempo de diseño aparecen lineas horizontales y verticales que el
evento paint no contiene.

Aqui mi codigo que lo cambie ahora de Paint a onPaint se comporta de la
misma manera.

Protected Overrides Sub OnPaint(ByVal e As
System.Windows.Forms.PaintEventArgs)
Dim i As Integer

For i = 0 To m_GridHeight
e.Graphics.DrawLine(Pens.Black, 0, CType((Me.Height - 1) /
m_GridHeight, Integer) * i, Me.Width, CType((Me.Height - 1) /
m_GridHeight, Integer) * i)
Next

For i = 0 To m_GridWidth
e.Graphics.DrawLine(Pens.Black, CType((Me.Width - 1) / m_GridWidth,
Integer) * i, 0, CType((Me.Width - 1) / m_GridWidth, Integer) * i,
Me.Height)
Next

e.Graphics.DrawRectangle(Pens.Black, e.ClipRectangle.X,
e.ClipRectangle.Y, e.ClipRectangle.Width - 1, e.ClipRectangle.Height -
1)

Me.Width = CType((Me.Width - 1) / m_GridWidth, Integer) * m_GridWidth
Me.Height = CType((Me.Height - 1) / m_GridHeight, Integer) *
m_GridHeight
End Sub
Respuesta Responder a este mensaje
#4 Tristan
06/07/2005 - 23:55 | Informe spam
La verdad es que me ha costado un montón ver lo que estaba mal :-)

Cuando vi tu código me pareció que el problema era sencillo. Al echarle un
vistazo a tu código me fijé en que referenciabas a ClipRectangle y pensé
dejat comentada la linea, pero olvidé comentarlo y me he vuelto loco
tratando de entender por qué pasaba eso. En fin, esas cosas que pasan.

El problema está en que ClipRectangle no es el tamaño del control. Es el
rectángulo que windows va a redibujar. Windows solo trata de redibujar el
área que se ha destapado, y hace clip sobre ella. Si te interesa el tema
busca información sobre el método Invalidate().

Por otro lado, no has mostrado el código de OnResize, pero en él debes
forzar el redibujado.

En resumen la cosa queda así:


Protected Overrides Sub OnPaint(ByVal e As
System.Windows.Forms.PaintEventArgs)
Dim i As Integer
For i = 0 To m_GridHeight
e.Graphics.DrawLine(Pens.Black, 0, CType((Me.Height - 1) /
m_GridHeight, Integer) * i, Me.Width, CType((Me.Height - 1) / m_GridHeight,
Integer) * i)
Next
For i = 0 To m_GridWidth
e.Graphics.DrawLine( _
Pens.Black, CType((Me.Width - 1) / m_GridWidth, Integer) * i, 0,
_
CType((Me.Width - 1) / m_GridWidth, Integer) * i, Me.Height)
Next
Dim marco As New Rectangle( _
Me.ClientRectangle.Location, _
New Size(Me.ClientSize.Width - 1, Me.ClientSize.Height - 1))
e.Graphics.DrawRectangle(Pens.Black, marco)
MyBase.OnPaint(e)
End Sub

Protected Overrides Sub OnResize(ByVal e As System.EventArgs)
Me.Size = New Size( _
CType((Me.Width - 1) / m_GridWidth, Integer) * m_GridWidth, _
CType((Me.Height - 1) / m_GridHeight, Integer) * m_GridHeight)
Me.Refresh()
MyBase.OnResize(e)
End Sub

He cambiado al OnResize el ajuste de tamaño. Por cierto, siempre me ha
parecido sorprendente que no se produzca un bucle infinito en estos casos.
Son pequeñas optimizaciones que windows hace.

Juan Carlos Badiola
MVP - C#
Respuesta Responder a este mensaje
#5 Juan Pedro Gonzalez
07/07/2005 - 10:20 | Informe spam
Hola,

La verdad es que si existe el autoredraw para tu propio control heredado (o
almenos algo parecido que mas o menos le da la misma funcionabilidad):

me.setstyle(ControlStyles.ResizeRedraw,True)

De hecho el SetStyle suele ser muy util cuando estamos dibujando un control
propio. Los parametros mas empleados del SetStyle suele ser el DoubleBuffer,
ResizeRedraw y UserPaint... Aunque evidentemente se le puede sacar jugo al
resto de los parametros.

Un saludo,

Juan Pedro González






"Tristan" escribió en el mensaje
news:
Lordvara, hoy he respondido a eso dos mensajes más abajo del tuyo. Mira un
mensaje que tiene de asunto "background Image"

Creo que el hecho de que no exista AutoRedraw no cambia nada. Tanto en vb6
como en todo windows como en .net, se DEBE pintar en el evento de Paint.
Pero si decides no hacerlo existe un equivalente al Autoredraw que


describo
en ese mensaje.

Juan Carlos Badiola
MVP - C#


Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente Respuesta Tengo una respuesta
Search Busqueda sugerida