2009-09-21 12 views

Respuesta

13
procedure TForm1.WMEnterSizeMove(var Message:TWMMove); 
begin 
    Self.DisableAlign; 
end; 

procedure TForm1.WMExitSizeMove(var Message:TWMMove); 
begin 
    Self.EnableAlign; 
end; 
+0

Eso está bien para evitar el parpadeo, pero también parece evitar la alineación por completo. Agregué una llamada Invalidate después de habilitar la alineación: no es perfecta, porque no se puede ver exactamente qué efecto va a tener el cambio de tamaño del formulario, pero al menos elimina todo el parpadeo en una forma compleja de varios paneles. – frogb

+0

procedimiento WMEnterSizeMove (var Message: TWMMove); mensaje WM_ENTERSIZEMOVE; procedimiento WMExitSizeMove (var Message: TWMMove); mensaje WM_EXITSIZEMOVE; no desencadena los eventos apropiados. En realidad, olvidé mencionar que es un marco y no una forma, pero supuse que habría sido lo mismo. – zz1433

4

Pruebe usar WM_SETREDRAW (not LockWindowUpdate).

También puede consultar DeferWindowPos.

+1

+1, ambos muy buenos consejos en sí mismo. Sin embargo, probablemente no ayuden con un formulario VCL complejo que use alineación, controles anidados, etc. 'DeferWindowPos()' vale la pena probar para la colocación manual en el controlador 'OnResize'. – mghie

4

Las formas complejas a menudo se componen de paneles anidados, y el proceso de repintado puede causar parpadeos. Si este es el caso con su proyecto hay dos soluciones fáciles que podría ayuda:

  1. Deshabilitar la propiedad FullRepaint en sus paneles.
  2. Habilite la propiedad DoubleBuffered en su formulario. No encontrará esta propiedad en el inspector de objetos, por lo tanto, ingrese DoubleBuffered := true; en FormCreate.
+1

Tenga en cuenta que 'DoubleBuffered' intercambia menos parpadeo para una velocidad de actualización más lenta, un efecto que puede notarse en pantallas grandes, donde el cambio de tamaño puede volverse" inestable "con tamaños de ventana más grandes. – mghie

+1

DoubleBuffered básicamente hace que su aplicación sea inútil en Citrix y Terminal Server. –

+1

>>> "DoubleBuffered básicamente hace que su aplicación sea inútil en Citrix y Terminal Server" ¿Puede especificar por qué? – Alex

1

He conseguido todo esto como sigue:

  1. En el caso de 'OnResize' de la forma, tener una rutina para ocultar todos los controles secundarios y luego iniciar un temporizador con una marca de alrededor de 500 ms .
  2. Cuando el temporizador se dispara, deshabilítelo y luego configure todos los controles secundarios como visibles.

Al jugar con esta actividad, obtienes un formulario que queda en blanco mientras lo estás dimensionando, pero luego se rellena ordenadamente cuando lo dejas ir.

Bri

+1

Creo que encontraría que manejar los mensajes mover de entrada/salida (con la modificación mencionada en mi comentario anterior) produce una mejor experiencia de usuario porque al menos puede ver el formulario (no personalizado) mientras cambia el tamaño de la ventana. – frogb

0

I evitar el parpadeo mediante la alineación de no más de componente no alClient por los padres, siempre emparejado con un alClient (por ejemplo un TPanel) para contener todos los demás componentes. Agrúpalos en paneles sin bordes.

Digamos que quiere alinear tres cosas: alLeft, alTop y alClient para la vista principal. Dont hacer esto: Form alTop alLeft alClient // your main view

Pero en lugar Integrar estas de la siguiente manera: Form alTop alClient // panel to avoid flicker alLeft alClient // your main view

La misma historia para incrustar varias alTop elementos.

Cuestiones relacionadas