Ayuda para corregir error visual redrawing effect en mi form

Iniciado por Eleкtro, 24 Noviembre 2012, 09:41 AM

0 Miembros y 1 Visitante están viendo este tema.

Eleкtro

Como reproducir este error?

1. Crear un nuevo winform

2. Seleccionar una imagen de fondo para el form

3. Añadir un panel

4. Cambiar la spropiedades del panel a "Color=Transparent", "AutoScroll=True", y añadr unos cuantos controles dentro del panel.

Ejemplo:




5. Ahora scrollear arriba o abajo y...









¿Como corregir este error?

Yo: He probado todo lo que me han aconsejado expertos, y sigo sin tener idea.

El método de Invalidate o Refresh soamente disimulan el problema real y crean otro problema, porque se "flashea" el panel todo el rato si scrolleamos.

Una solución sería crear una vScrollbar para mi panel, y cambiar el mínimo de scroll-lines al usar la mouse-wheel, por ejemplo scrollear 15 lineas en vez de las 6 por defecto, ya que si scrolleo una página entera no tengo ningún problema visual. Pero esto no se hacerlo por mi mismo, si alguien me pudiera dar un ejemplo se lo agradecería mucho, pues con esto ya podría terminar mi app.






Más información:

(Supuestas soluciones que a mi no me han servido del todo, quizás no he sabido usarlas correctamente)

http://stackoverflow.com/questions/13516557/visual-problems-with-the-form-background-image
http://stackoverflow.com/questions/13535693/change-mouse-wheel-scroll-lines
http://www.daniweb.com/software-development/vbnet/threads/441204/how-to-correct-a-redrawing-background-cutted-effect-inside-a-panel
http://www.vbdotnetforums.com/vb-net-general-discussion/54165-how-correct-redrawing-background-cutted-effect-inside-panel.html#post153014








seba123neo

#1
la solucion que me funciono, es de crear un panel personalizado (una clase que herede del control panel), y dentro hacer el codigo necesario para que se bloquee el redraw, con la api LockWindowUpdate y el OptimizedDoubleBuffer que se usa para que no flickee o flashee como dijiste vos.

Código (vbnet) [Seleccionar]
Public Class MyPanel
   Inherits Panel
   Public Sub New()
       Me.AutoScroll = True
       Me.SetStyle(ControlStyles.SupportsTransparentBackColor, True)
       Me.SetStyle(ControlStyles.OptimizedDoubleBuffer, True)
   End Sub
   Private mImage As Image
   Public Property Image() As Image
       Get
           Return mImage
       End Get
       Set(ByVal value As Image)
           mImage = value
           Invalidate()
       End Set
   End Property
   Protected Overrides Sub OnScroll(ByVal se As ScrollEventArgs)
       If se.Type = ScrollEventType.First Then
           LockWindowUpdate(Me.Handle)
       ElseIf se.Type = ScrollEventType.ThumbTrack OrElse se.Type = ScrollEventType.ThumbPosition Then
           LockWindowUpdate(IntPtr.Zero)
           Me.Refresh()
           LockWindowUpdate(Me.Handle)
       Else
           LockWindowUpdate(IntPtr.Zero)
           Me.Invalidate()
       End If
       MyBase.OnScroll(se)
   End Sub
   Protected Overrides Sub OnPaint(ByVal e As PaintEventArgs)
       Console.WriteLine(e.ClipRectangle.ToString())
       Using br As New SolidBrush(Me.BackColor)
           e.Graphics.FillRectangle(br, Me.ClientRectangle)
       End Using
       If mImage IsNot Nothing Then
           e.Graphics.DrawImage(mImage, 0, 0)
       End If
       MyBase.OnPaint(e)
   End Sub
   <DllImport("user32.dll")> _
   Private Shared Function LockWindowUpdate(ByVal hWnd As IntPtr) As Boolean
   End Function
End Class


es como si fuera un panel comun de visual basic, ya que hereda todas als propiedades del panel, salvo que se le programa dentro para que haga lo que vos quieras. fijate que te tiene que aparecer como si fuera un control en la barra de controles, llamado "MyPanel" despues cambiale el nombre por el que quieras. para que te aparezca como control tenes que generar la solucion.

lo metes en el form y listo, usas ese.

saludos.



La característica extraordinaria de las leyes de la física es que se aplican en todos lados, sea que tú elijas o no creer en ellas. Lo bueno de las ciencias es que siempre tienen la verdad, quieras creerla o no.

Neil deGrasse Tyson

Eleкtro

Te lo agradezco Seba, pero el efecto que consigo con ese nuevo control es el mismo que se aprecia en la imagen que puse... no cambia absolutamente nada, todo sigue igual  :(

Para asegurarme lo he probado tanto en mi APP como creando un nuevo winform solamente con tu class, el MyPanel, y unos checkboxes como en el ejemplo que puse...

¿Debo hacer algo en especial con tu class aparte de "crear" el nuevo panel en mi form y meter los checkboxes adentro?

Por si sirve de algo, el entorno en el que lo estoy intentando es:
winform + .net framework 4.5

¿Que configuración has usado para que te funcione?

un saludo








Keyen Night

Yo lo resolví así no es perfecto pero disimula casi totalmente...

Ese código en el evento Load del Form

Código (vb.net) [Seleccionar]
        Me.DoubleBuffered = True
        Panel1.GetType.GetProperty( _
"DoubleBuffered", _
Reflection.BindingFlags.NonPublic Or _
Reflection.BindingFlags.Instance) _
.SetValue(Panel1, True, Nothing)


Y en el evento Scroll, no en el MouseWheel, colocas...

Código (vb.net) [Seleccionar]
Panel1.Invalidate()

Sino lo vez bien entonces solo queda una alternativa, recortar el rectángulo del BackgroundImage que esta detrás del Panel y colocarlo como fondo al Panel, el método Invalidate llama al evento Paint del Panel de modo que se puede editar las coordenadas y tamaños en el evento Scroll para que al hacer Invalidate se redibuje el rectángulo. Estoy haciendo el ejemplo a ver si se ve mejor.
La Fé Mueve Montañas...
                                    ...De Dinero

La programación es más que un trabajo es más que un hobby es una pasión...

seba123neo

Cita de: EleKtro H@cker en 24 Noviembre 2012, 15:33 PM
Te lo agradezco Seba, pero el efecto que consigo con ese nuevo control es el mismo que se aprecia en la imagen que puse... no cambia absolutamente nada, todo sigue igual  :(

Para asegurarme lo he probado tanto en mi APP como creando un nuevo winform solamente con tu class, el MyPanel, y unos checkboxes como en el ejemplo que puse...

¿Debo hacer algo en especial con tu class aparte de "crear" el nuevo panel en mi form y meter los checkboxes adentro?

Por si sirve de algo, el entorno en el que lo estoy intentando es:
winform + .net framework 4.5

¿Que configuración has usado para que te funcione?

un saludo


una imagen para que veas que funciona:



fijate que el primero es un panel normal.
La característica extraordinaria de las leyes de la física es que se aplican en todos lados, sea que tú elijas o no creer en ellas. Lo bueno de las ciencias es que siempre tienen la verdad, quieras creerla o no.

Neil deGrasse Tyson

Eleкtro

#5
Cita de: seba123neo en 24 Noviembre 2012, 16:20 PM
una imagen para que veas que funciona:



fijate que el primero es un panel normal.

!!!!!!!!!!!!! como es posible? Hice todo lo que me dijiste y solo consigo que se véa "MyPanel" como el panel de la izquierda :(

es más, como es posible que esos 2 paneles se muevan mientras arrastras la rueda esa? si yo creo un panel, por defecto no consigo que se mueva al arrastrar como lo haces tú... solo puedo hacerlo con la rueda de mi mouse, o pinchando en la scrollbar sin mantener apretado.

Seba, lo de la imagen es un winform??

Uf, necesito conseguir el mismo efecto :(


¿¿¿¿Me podrías pasar el source????


PD: Keyen, en un rato pruebo tu solución, gracias!








seba123neo

Citar
como es posible que esos 2 paneles se muevan mientras arrastras la rueda esa?

pues asi es el panel por defecto, mientras moves el scroll se mueve el contenido, no quiero creer que en el VB 2010 no se mueva el contenido, hasta el VB6 tiene esa funcion.

Citarsi yo creo un panel, por defecto no consigo que se mueva al arrastrar como lo haces tú... solo puedo hacerlo con la rueda de mi mouse, o pinchando en la scrollbar sin mantener apretado.

eso es raro, no creo que el VB 2010 es peor que el 2008  y le sacaron esa funcion :o

CitarSeba, lo de la imagen es un winform??

si, es un formulario comun con una imagen de fondo, la recorte porque mi monitor es gigante y el gif pesaba megas.

aca podes descargar el codigo del proyecto:

Panel

La característica extraordinaria de las leyes de la física es que se aplican en todos lados, sea que tú elijas o no creer en ellas. Lo bueno de las ciencias es que siempre tienen la verdad, quieras creerla o no.

Neil deGrasse Tyson

Eleкtro

#7
Cita de: seba123neo en 24 Noviembre 2012, 17:04 PM
asi es el panel por defecto, mientras moves el scroll se mueve el contenido, no quiero creer que en el VB 2010 no se mueva el contenido, hasta el VB6 tiene esa funcion.

Uso VS2012 (Ultimate).

He usado tu source, sin modificar NADA (Solamente he actualizado los ficheros para la migración a VS2012) y aqui tengo la prueba de lo que me ocurre, es muy raro...

Como ves las scrollbars de los paneles no hay modo de "arrastrarlos", y el panel de la derecha flickea o flashea (Y el de la izquierda ni te cuento lo que hace puf xD).

[youtube=640,360]http://www.youtube.com/watch?v=uujKPYjt9Xg&feature=youtu.be[/youtube]


¿Alguna idea de esta diferencia entre tu imagen y la mía?








seba123neo

para saber si es un problema del VB2012 hace esto, ejecuta el .exe de la carpeta debug del proyecto que yo te pase (que esta compilado usando VB 2008), si ahi la scrollbar te funciona, es porque el problema es el VB 2012.
La característica extraordinaria de las leyes de la física es que se aplican en todos lados, sea que tú elijas o no creer en ellas. Lo bueno de las ciencias es que siempre tienen la verdad, quieras creerla o no.

Neil deGrasse Tyson

Eleкtro

#9
Cita de: seba123neo en 24 Noviembre 2012, 18:49 PM
para saber si es un problema del VB2012 hace esto, ejecuta el .exe de la carpeta debug del proyecto que yo te pase (que esta compilado usando VB 2008), si ahi la scrollbar te funciona, es porque el problema es el VB 2012.

Hola Seba,

He vuelto a descargar el archivo de mediafire, he ejecutado el exe de la cerpeta debug, y es lo mismo, no puedo arrastrar la scrollbar y además flashea.

PD: Uso win7 x64, pero también he probado el exe en una máquina virtual con Win7 x64 sin mi theme oscuro de Windows y sin modificar

:-(