2011-06-07 16 views
7

Tengo una ventana en la que muestro una imagen. Quiero que el usuario pueda cambiar el tamaño de esta ventana, pero mantenerlo en la misma relación de aspecto que la imagen, por lo que no aparecen grandes áreas vacías en la ventana.Cambiar el tamaño de la forma manteniendo la relación de aspecto

lo que he intentado es algo como esto en el caso OnResize:

DragWidth := Width; 
DragHeight := Height; 

//Calculate corresponding size with aspect ratio 
//... 
//Calculated values are now in CalcWidth and CalcHeight 

Width := CalcWidth; 
Height := CalcHeight; 

El problema con esto es, que las ventanas parpadea durante el cambio de tamaño arrastrando entre el tamaño de cambio de tamaño original y el calculado, ya que el evento OnResize se llama afaik después de que el cambio de tamaño ya está hecho (y pintado una vez).

¿Conoces alguna solución para tener un cambio de tamaño de relación de aspecto sin problemas?

Gracias por cualquier Ayuda.

Respuesta

7

Añadiendo el siguiente controlador para el evento OnCanResize parecía funcionar muy bien para mí:

procedure TForm1.FormCanResize(Sender: TObject; var NewWidth, 
    NewHeight: Integer; var Resize: Boolean); 
var 
    AspectRatio:double; 
begin 
    AspectRatio:=Height/Width; 
    NewHeight:=round(AspectRatio*NewWidth); 
end; 

Por supuesto, puede que desee cambiar el método de cálculo de NewHeight y NewWidth. El siguiente método se siente intuitivamente "derecho" cuando intento en un formulario en blanco:

NewHeight:=round(0.5*(NewHeight+AspectRatio*NewWidth)); 
    NewWidth:=round(NewHeight/AspectRatio); 
+2

Usted probablemente tiene esta resuelto ya, pero para cualquier otra persona interesada, sugeriría mantener la relación de aspecto de ClientWidth y clientHeight constante en lugar de cómo lo hice arriba. Esto, por supuesto, será un poco más complicado. – boileau

+0

¿Puede explicar cómo aplicar este método un poco más? Soy muy nuevo en Delphi y estoy bastante confundido acerca de cómo configurar este controlador en el evento OnCanResize. Puedes darme un ejemplo ? Altamente apreciado. Gracias – Eduard

+0

Seleccione el formulario en la ventana de diseño, busque la pestaña de eventos en el lado izquierdo, encuentre OnCanResize y haga doble clic en la celda blanca a la derecha del texto OnCanResize. (Utilizando Delphi 2009) – boileau

2

Delphi recientes tienen el evento OnCanResize, que le permiten hacer exactamente esto. Simplemente puede devolver NewWidth y NewHeight calculados directamente desde el evento.

Cuestiones relacionadas