Redimensionar un formulario sin bordes
Artículo por Club Developers · 01 marzo 2006
3355 vistas
Como hemos visto en el ejemplo del [iurl=85&fs=182#225]desplazamiento de la ventana sin barra de título[/iurl], vamos a simular la presencia de los bordes en una ventana que tiene la propiedad BorderStyle = bsNone.
Al mover el ratón por la ventana, Windows envía el mensaje WMHitTest que devuelve la posición del ratón en la pantalla. Por lo tanto, sólo es necesario establecer una zona, por ejemplo a la derecha de la ventana, donde enviaremos un mensaje diciendo que el redimensionado es posible.
Declaración:
Implementación
Este código nos permite el redimensionado por el lado derecho del formualrio cuando el ratón esté a 5 pÃxels del borde.
Nota1:
Para recrear un redimensionado clásico tendrÃamos que chequear por todos los lados y cada una de las esquinas del formulario.
Sobretodo mirar primero las esquinas y hacer un Exit si lo fuera, porque siempre estamos en un borde.
Algunos resultados a usar:
Podemos ver todas las constantes en el MSDN
Nota2:
Este procedimiento sólo funciona cuando el ratón pasa sobre el formulario. Si tenemos un TDBGrid con align=alClient no nos funcionará. La solución es tener TPannels con Enabled=false alrededor del formulario (con Align=AlLeft, AlRight,..) y de 2 o 3 pixels de anchura.
Al mover el ratón por la ventana, Windows envía el mensaje WMHitTest que devuelve la posición del ratón en la pantalla. Por lo tanto, sólo es necesario establecer una zona, por ejemplo a la derecha de la ventana, donde enviaremos un mensaje diciendo que el redimensionado es posible.
Declaración:
delphi
{public} Â Â procedure WMNCHitTest(var msg: TWMNCHitTest); message WM_NCHITTEST;
Implementación
delphi
procedure TForm1.WMNCHitTest(var msg: TWMNCHittest); var  pt: TPoint; begin  // coger la posición del ratón  pt := ScreenToClient(Point(msg.XPos, msg.YPos));  // miramos si el ratón está en la zona deseada  if PtInRect(Rect(ClientWidth-5, 0, ClientWidth, ClientHeight), pt) then  begin   msg.Result:= HTRIGHT;   exit;  end; end;
Este código nos permite el redimensionado por el lado derecho del formualrio cuando el ratón esté a 5 pÃxels del borde.
Nota1:
Para recrear un redimensionado clásico tendrÃamos que chequear por todos los lados y cada una de las esquinas del formulario.
Sobretodo mirar primero las esquinas y hacer un Exit si lo fuera, porque siempre estamos en un borde.
Algunos resultados a usar:
- Borde inferior: HTBOTTOM
- Borde izquierdo: HTLEFT
- Borde derecho: HTRIGHT
- Borde superior: HTTOP
Podemos ver todas las constantes en el MSDN
Nota2:
Este procedimiento sólo funciona cuando el ratón pasa sobre el formulario. Si tenemos un TDBGrid con align=alClient no nos funcionará. La solución es tener TPannels con Enabled=false alrededor del formulario (con Align=AlLeft, AlRight,..) y de 2 o 3 pixels de anchura.