Pausar el Repintado de Windows

08/07/2009 - 16:33 por Irak | Informe spam
Hola, Hice un control especial parecido a un grid que cuando refresco la
información carga todos los datos en otros controles contenedores y asi
sucesivamente. Funciona correctamente sin embargo a la hora de refrescar la
informacion, se muestra "espectacularmente" el repintado de mi grid. He
intentado trucos caseros como inhabilitar el control, desaparecerlo y
aparecerlo, pero nada... :-( Segun existen métodos como el BeginUpdate() y
EndUpdate() que tengo entendido se diseñaron para esto, pero no los tiene el
control Panel (que es donde se agregan dinámicamente los controles).

Existe algun truco o forma para quitarle la "Espectacularidad" a mi
formulario durante el repintado?? ¿APIS? ¿Funcion .net?

Muchas gracias, como siempre

Datos del Hardware
PC Intel 3 Nucleos
4 GB Ram
Windows Vista Ultimate
Visual Studio 2008
C#

Preguntas similare

Leer las respuestas

#1 RFOG
08/07/2009 - 17:40 | Informe spam
¿Sacas los datos mientras pintas? La forma correcta es, una vez tienes lo
que vas a pintar (calculado, traído de donde sea, etc), hacer un
invalidate y junto pintar en el evento OnPaint.

De todos modos, con técnicas de doble buffer se suele minimizar todo esto.
Echale un vistado a esta entrada de mi blog:
http://geeks.ms/blogs/rfog/archive/...panel.aspx

On Wed, 08 Jul 2009 16:33:01 +0200, Irak
wrote:

Hola, Hice un control especial parecido a un grid que cuando refresco la
información carga todos los datos en otros controles contenedores y asi
sucesivamente. Funciona correctamente sin embargo a la hora de refrescar
la
informacion, se muestra "espectacularmente" el repintado de mi grid. He
intentado trucos caseros como inhabilitar el control, desaparecerlo y
aparecerlo, pero nada... :-( Segun existen métodos como el
BeginUpdate() y
EndUpdate() que tengo entendido se diseñaron para esto, pero no los
tiene el
control Panel (que es donde se agregan dinámicamente los controles).

Existe algun truco o forma para quitarle la "Espectacularidad" a mi
formulario durante el repintado?? ¿APIS? ¿Funcion .net?

Muchas gracias, como siempre

Datos del Hardware
PC Intel 3 Nucleos
4 GB Ram
Windows Vista Ultimate
Visual Studio 2008
C#






Microsoft Visual C++ MVP => http://geeks.ms/blogs/rfog
El amor sin admiración solo es amistad.
Respuesta Responder a este mensaje
#2 RFOG
08/07/2009 - 20:03 | Informe spam
Prueba a llamar a SuspendLayout() y ResumeLayout() cuando termines del
componente padre...

On Wed, 08 Jul 2009 18:16:02 +0200, Irak
wrote:

Saludos RFOG

Si, los datos ya los tengo en un datatable.
Posteriormente recorro los datos y voy creando una instancia de cada
control
y asignandole un valor, luego este control lo agrego a una coleccion de
controles del objeto panel por ejemplo:
"Panel1.Controls.Add(Mi_Control)" ,
lo que significa que con la finalidad de ahorrarme un trabajo más
artesanal,
no dibujo los controles con el graphics (si es a eso lo que te
refieres). ;-)


"RFOG" wrote:

¿Sacas los datos mientras pintas? La forma correcta es, una vez tienes
lo
que vas a pintar (calculado, traído de donde sea, etc), hacer un
invalidate y junto pintar en el evento OnPaint.

De todos modos, con técnicas de doble buffer se suele minimizar todo
esto.
Echale un vistado a esta entrada de mi blog:
http://geeks.ms/blogs/rfog/archive/...panel.aspx

On Wed, 08 Jul 2009 16:33:01 +0200, Irak

wrote:

> Hola, Hice un control especial parecido a un grid que cuando refresco
la
> información carga todos los datos en otros controles contenedores y
asi
> sucesivamente. Funciona correctamente sin embargo a la hora de
refrescar
> la
> informacion, se muestra "espectacularmente" el repintado de mi grid.
He
> intentado trucos caseros como inhabilitar el control, desaparecerlo y
> aparecerlo, pero nada... :-( Segun existen métodos como el
> BeginUpdate() y
> EndUpdate() que tengo entendido se diseñaron para esto, pero no los
> tiene el
> control Panel (que es donde se agregan dinámicamente los controles).
>
> Existe algun truco o forma para quitarle la "Espectacularidad" a mi
> formulario durante el repintado?? ¿APIS? ¿Funcion .net?
>
> Muchas gracias, como siempre
>
> Datos del Hardware
> PC Intel 3 Nucleos
> 4 GB Ram
> Windows Vista Ultimate
> Visual Studio 2008
> C#
>



Microsoft Visual C++ MVP => http://geeks.ms/blogs/rfog
>> El amor sin admiración solo es amistad.








Microsoft Visual C++ MVP => http://geeks.ms/blogs/rfog
El amor sin admiración solo es amistad.
Respuesta Responder a este mensaje
#3 RFOG
09/07/2009 - 19:47 | Informe spam
Que yo sepa no hay nada en Win32 para eso, y menos aún cuando hablamos de
.NET, que muchas cosas se hacen sin conocimiento de Win32... En Win32 se
hace como te explicado en la primera respuesta.

Cuando programaba en serio en .NET, recuerdo que el SuspendLayout no me
funcionaba fuera de InitializeComponent(), pero como al final tampoco
estuve seguro, ya que lo resolví haciendo el proyecto en C++ y MFC (por
otros motivos, no por ese), no he sido "inistente" con el tema (famosas
son mis diatribas sobre los bugs eternos y est*pidos de .NET), pero creo
que no funciona fuera de ese método como no funciona/ban otras cosas fuera
de InitializeComponent() y Windows Forms, aunque supongo que habrán
arreglado algunas (de hecho otros bugs sí que los han arreglado).

Hasta donde yo sé, esa es la forma correcta de hacerlo. Si no funciona
-cosa que no me extrañaría nada-, no se me ocurre otra cosa mas que hacer
lo que te he respondido en el primer mensaje.

.NET deja que los componentes se pinten a sí mismos (que es lo lógico y
coherente en una arquitectura de componentes), por lo que en el evento
OnPaint va pasando de uno a otro para que se pinten, pero no me extrañaría
nada que los vaya pintando de abajo a arriba en algunos casos, aunque lo
suyo sería calcular ocultaciones y demás y sólo dejar que se pinten los
que deben... Nunca he llegado a necesitar ese nivel de complejidad en
.NET, así que no puedo decirte más.



On Thu, 09 Jul 2009 19:23:01 +0200, Irak Rubio
wrote:

RFOG,
Hola, probé con los métodos que me recomendaste pero no cambió en nada el
repintado. ¿Es posible que debido al proceso de carga de los controles
tenga
Windows que mostrar el repintado como si fueran capas? En alguna ocasión
escuché que existían unas APIS de windows que paralizaban el repintado
de una
ventana segun el HWND no sé ¿tendrás conocimiento de eso?

Un saludo y mil gracias por tu ayuda

"RFOG" wrote:

Prueba a llamar a SuspendLayout() y ResumeLayout() cuando termines del
componente padre...

On Wed, 08 Jul 2009 18:16:02 +0200, Irak

wrote:

> Saludos RFOG
>
> Si, los datos ya los tengo en un datatable.
> Posteriormente recorro los datos y voy creando una instancia de cada
> control
> y asignandole un valor, luego este control lo agrego a una coleccion
de
> controles del objeto panel por ejemplo:
> "Panel1.Controls.Add(Mi_Control)" ,
> lo que significa que con la finalidad de ahorrarme un trabajo más
> artesanal,
> no dibujo los controles con el graphics (si es a eso lo que te
> refieres). ;-)
>
>
> "RFOG" wrote:
>
>> ¿Sacas los datos mientras pintas? La forma correcta es, una vez
tienes
>> lo
>> que vas a pintar (calculado, traído de donde sea, etc), hacer un
>> invalidate y junto pintar en el evento OnPaint.
>>
>> De todos modos, con técnicas de doble buffer se suele minimizar todo
>> esto.
>> Echale un vistado a esta entrada de mi blog:
>>
http://geeks.ms/blogs/rfog/archive/...panel.aspx
>>
>> On Wed, 08 Jul 2009 16:33:01 +0200, Irak
>>
>> wrote:
>>
>> > Hola, Hice un control especial parecido a un grid que cuando
refresco
>> la
>> > información carga todos los datos en otros controles contenedores y
>> asi
>> > sucesivamente. Funciona correctamente sin embargo a la hora de
>> refrescar
>> > la
>> > informacion, se muestra "espectacularmente" el repintado de mi
grid.
>> He
>> > intentado trucos caseros como inhabilitar el control,
desaparecerlo y
>> > aparecerlo, pero nada... :-( Segun existen métodos como el
>> > BeginUpdate() y
>> > EndUpdate() que tengo entendido se diseñaron para esto, pero no los
>> > tiene el
>> > control Panel (que es donde se agregan dinámicamente los
controles).
>> >
>> > Existe algun truco o forma para quitarle la "Espectacularidad" a mi
>> > formulario durante el repintado?? ¿APIS? ¿Funcion .net?
>> >
>> > Muchas gracias, como siempre
>> >
>> > Datos del Hardware
>> > PC Intel 3 Nucleos
>> > 4 GB Ram
>> > Windows Vista Ultimate
>> > Visual Studio 2008
>> > C#
>> >
>>
>>
>>
>> Microsoft Visual C++ MVP => http://geeks.ms/blogs/rfog
>> >> >> El amor sin admiración solo es amistad.
>>



Microsoft Visual C++ MVP => http://geeks.ms/blogs/rfog
>> El amor sin admiración solo es amistad.








Microsoft Visual C++ MVP => http://geeks.ms/blogs/rfog
Moneda a moneda se hacen las rentas.
email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida