Al cambiar el tamaño de un formulario con muchos controles, el formulario se ve mal debido al parpadeo. ¿Cuáles son algunos consejos para tener un cambio de forma más suave?¿Cómo puedo hacer que mi formulario cambie de tamaño más fácilmente?
Respuesta
procedure TForm1.WMEnterSizeMove(var Message:TWMMove);
begin
Self.DisableAlign;
end;
procedure TForm1.WMExitSizeMove(var Message:TWMMove);
begin
Self.EnableAlign;
end;
Pruebe usar WM_SETREDRAW (not LockWindowUpdate).
También puede consultar DeferWindowPos.
+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
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:
- Deshabilitar la propiedad
FullRepaint
en sus paneles. - Habilite la propiedad
DoubleBuffered
en su formulario. No encontrará esta propiedad en el inspector de objetos, por lo tanto, ingreseDoubleBuffered := true;
en FormCreate.
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
DoubleBuffered básicamente hace que su aplicación sea inútil en Citrix y Terminal Server. –
>>> "DoubleBuffered básicamente hace que su aplicación sea inútil en Citrix y Terminal Server" ¿Puede especificar por qué? – Alex
He conseguido todo esto como sigue:
- 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 .
- 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
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
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.
- 1. ¿Cómo debo hacer para que mi inputAccessoryView cambie de tamaño cuando gire el dispositivo?
- 2. WPF: ¿Cómo hacer que el lienzo cambie el tamaño automáticamente?
- 3. ¿Cómo puedo hacer que mi colisión sea más sólida?
- 4. ¿Cómo puedo hacer que la antigua región cambie el tamaño de forma adaptativa en Java GC?
- 5. ¿Cómo evito que el usuario cambie el tamaño de un formulario?
- 6. Qt: ¿cómo hacer que mainWindow cambie automáticamente el tamaño cuando se cambie el tamaño del widget central?
- 7. ¿Cómo puedo hacer que UIImageView cambie su imagen mediante programación?
- 8. C# cómo evitar que el usuario cambie el tamaño de la ventana de mi aplicación?
- 9. ¿Cómo evito que el WPF GridSplitter cambie el tamaño de mi cuadrícula?
- 10. ¿Cómo puedo hacer que mi dispositivo vibre?
- 11. ¿Cómo puedo hacer que mi formulario sea transparente, pero no lo que hago?
- 12. Cómo evitar que UIBarButtonItem con atributos personalizados cambie de tamaño
- 13. Cómo un desarrollador de Windows puede hacer que su software funcione más fácilmente en Wine
- 14. ¿Cómo hacer que una imagen cambie el tamaño de la altura de las pantallas con CSS?
- 15. ¿Cómo puedo captar previamente una región de memoria más fácilmente?
- 16. ¿Cómo hacer que un UITableViewCell dibujado a medida cambie de tamaño correctamente?
- 17. ¿Cómo puedo hacer que enlace mi gran programa?
- 18. ¿Cómo hacer que una subvista cambie el tamaño automáticamente con su supervista?
- 19. Cómo hacer que mi código sea más seguro
- 20. ¿Cómo puedo hacer que el tamaño de la imagen sea más pequeño en un botón?
- 21. Cómo puedo hacer que mi ImageView tenga un tamaño fijo independientemente del tamaño del mapa de bits
- 22. cómo hacer que UIProgressView en UITableViewCell cambie inmediatamente?
- 23. Cómo hacer que mi aplicación copie el archivo más rápido
- 24. No quiero que Android cambie el tamaño de mi mapa de bits Automáticamente
- 25. ¿Cómo puedo hacer que mi código jquery sea más fácil de arrastrar/soltar?
- 26. ¿Cómo puedo hacer que mis anuncios aparezcan más rápido en mi aplicación de Android?
- 27. ¿Cómo puedo hacer que mi código sobreviva? (anti software rot)
- 28. ¿Cómo puedo hacer que mi objeto de física se calme?
- 29. ¿Puedo hacer que JUnit sea más detallado?
- 30. ¿Qué puede hacer que cambie Oracle ROWID?
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
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