Foro de elhacker.net

Programación => .NET (C#, VB.NET, ASP) => Mensaje iniciado por: Eleкtro en 24 Noviembre 2012, 09:41 am



Título: Ayuda para corregir error visual redrawing effect en mi form
Publicado por: Eleкtro en 24 Noviembre 2012, 09:41 am
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:

(http://img20.imageshack.us/img20/6059/prtscrcapture2h.jpg)


5. Ahora scrollear arriba o abajo y...


(http://img854.imageshack.us/img854/8603/prtscrcaptureuo.jpg)





¿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


Título: Re: Ayuda para corregir error visual redrawing effect en mi form
Publicado por: seba123neo en 24 Noviembre 2012, 14:54 pm
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
  1. Public Class MyPanel
  2.    Inherits Panel
  3.    Public Sub New()
  4.        Me.AutoScroll = True
  5.        Me.SetStyle(ControlStyles.SupportsTransparentBackColor, True)
  6.        Me.SetStyle(ControlStyles.OptimizedDoubleBuffer, True)
  7.    End Sub
  8.    Private mImage As Image
  9.    Public Property Image() As Image
  10.        Get
  11.            Return mImage
  12.        End Get
  13.        Set(ByVal value As Image)
  14.            mImage = value
  15.            Invalidate()
  16.        End Set
  17.    End Property
  18.    Protected Overrides Sub OnScroll(ByVal se As ScrollEventArgs)
  19.        If se.Type = ScrollEventType.First Then
  20.            LockWindowUpdate(Me.Handle)
  21.        ElseIf se.Type = ScrollEventType.ThumbTrack OrElse se.Type = ScrollEventType.ThumbPosition Then
  22.            LockWindowUpdate(IntPtr.Zero)
  23.            Me.Refresh()
  24.            LockWindowUpdate(Me.Handle)
  25.        Else
  26.            LockWindowUpdate(IntPtr.Zero)
  27.            Me.Invalidate()
  28.        End If
  29.        MyBase.OnScroll(se)
  30.    End Sub
  31.    Protected Overrides Sub OnPaint(ByVal e As PaintEventArgs)
  32.        Console.WriteLine(e.ClipRectangle.ToString())
  33.        Using br As New SolidBrush(Me.BackColor)
  34.            e.Graphics.FillRectangle(br, Me.ClientRectangle)
  35.        End Using
  36.        If mImage IsNot Nothing Then
  37.            e.Graphics.DrawImage(mImage, 0, 0)
  38.        End If
  39.        MyBase.OnPaint(e)
  40.    End Sub
  41.    <DllImport("user32.dll")> _
  42.    Private Shared Function LockWindowUpdate(ByVal hWnd As IntPtr) As Boolean
  43.    End Function
  44. End Class
  45.  

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.





Título: Re: Ayuda para corregir error visual redrawing effect en mi form
Publicado por: Eleкtro 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


Título: Re: Ayuda para corregir error visual redrawing effect en mi form
Publicado por: Keyen Night en 24 Noviembre 2012, 15:49 pm
Yo lo resolví así no es perfecto pero disimula casi totalmente...

Ese código en el evento Load del Form

Código
  1.        Me.DoubleBuffered = True
  2.        Panel1.GetType.GetProperty( _
  3. "DoubleBuffered", _
  4. Reflection.BindingFlags.NonPublic Or _
  5. Reflection.BindingFlags.Instance) _
  6. .SetValue(Panel1, True, Nothing)

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

Código
  1. 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.


Título: Re: Ayuda para corregir error visual redrawing effect en mi form
Publicado por: seba123neo en 24 Noviembre 2012, 16:20 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:

(http://img171.imageshack.us/img171/7946/45727087.gif)

fijate que el primero es un panel normal.


Título: Re: Ayuda para corregir error visual redrawing effect en mi form
Publicado por: Eleкtro en 24 Noviembre 2012, 16:26 pm
una imagen para que veas que funciona:

(http://img171.imageshack.us/img171/7946/45727087.gif)

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!


Título: Re: Ayuda para corregir error visual redrawing effect en mi form
Publicado por: seba123neo en 24 Noviembre 2012, 17:04 pm
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.

Citar
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.

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

Citar
Seba, 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 (http://www.mediafire.com/?mif6timtmcn50nd)



Título: Re: Ayuda para corregir error visual redrawing effect en mi form
Publicado por: Eleкtro en 24 Noviembre 2012, 18:31 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).

uujKPYjt9Xg


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


Título: Re: Ayuda para corregir error visual redrawing effect en mi form
Publicado por: 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.


Título: Re: Ayuda para corregir error visual redrawing effect en mi form
Publicado por: Eleкtro en 24 Noviembre 2012, 19:04 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

 :-(


Título: Re: Ayuda para corregir error visual redrawing effect en mi form
Publicado por: seba123neo en 24 Noviembre 2012, 19:11 pm
yo tambien tengo Win7 x64, con el tema por defecto con aero.

me gustaria que otros usuarios prueben y comente como le fue.


Título: Re: Ayuda para corregir error visual redrawing effect en mi form
Publicado por: Eleкtro en 24 Noviembre 2012, 19:31 pm
yo tambien tengo Win7 x64, con el tema por defecto con aero.

me gustaria que otros usuarios prueben y comente como le fue.

Vamos a hacer una cosa... si te parece bien, ¿Me puedes decir si mi app te funciona sin "flasheos"?

Uso el control que me proporcionaste, y así puedo salir de dudas sobre si es un error de mi Windows (Todo apunta que sí  :xD) o es otro tipo de error.

Que alguien haga el favor de probar mi app y me diga si scrollea bien o no!  :-[

http://exoshare.com/download.php?uid=RDOJYVQR

Gracias