Desplazar una ventana sin barra de título
Artículo por Club Developers · 01 marzo 2006
2751 vistas
Sin barra de título, el usuario no puede desplazar la ventana con la ayuda del ratón. No obstante, es posible de simular este comportamiento con un clic sobre el formulario. Este método debe usarse en el caso de que la propiedad BorderStyle=bsNone.
En el evento OnMouseDown hacemos:
Este método puede aplicarse a cualquier descendiente de TWinControl.
Otro manera de hacerlo es usar el mensaje WM_NCHITTEST enviado por Windows a la ventana cuando el usuario mueve el ratón. La respuesta de este mensaje es usado por Windows para determinar en qué zona se encuentra el ratón: en la parte cliente, sobre un botón de sistema, en uno de los bordes,... Una de estas respuestas es la que nos interesa particularmente. Es el valor HTCAPTION el que indica a Windows que el cursor se encuentra an la barra de título. En este caso, Windows interpretará el desplazamiento del ratón con el botón izquierdo pulsado como un desplazamientode la ventana. Es exactamente lo que nos interesa. Vamos a crear un procedimiento que nos gestione dicho mensaje.
El siguiente ejemplo autoriza el desplazamiento si el cursor se encuentra en los 20 pÃxels más altos de la ventana, lo que nos permite simular nuestra propia barra de título.
En el evento OnMouseDown hacemos:
delphi
procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;  Shift: TShiftState; X, Y: Integer); begin  ReleaseCapture;  Perform(WM_SysCommand, SC_MOVE, 0); end;
Este método puede aplicarse a cualquier descendiente de TWinControl.
Otro manera de hacerlo es usar el mensaje WM_NCHITTEST enviado por Windows a la ventana cuando el usuario mueve el ratón. La respuesta de este mensaje es usado por Windows para determinar en qué zona se encuentra el ratón: en la parte cliente, sobre un botón de sistema, en uno de los bordes,... Una de estas respuestas es la que nos interesa particularmente. Es el valor HTCAPTION el que indica a Windows que el cursor se encuentra an la barra de título. En este caso, Windows interpretará el desplazamiento del ratón con el botón izquierdo pulsado como un desplazamientode la ventana. Es exactamente lo que nos interesa. Vamos a crear un procedimiento que nos gestione dicho mensaje.
El siguiente ejemplo autoriza el desplazamiento si el cursor se encuentra en los 20 pÃxels más altos de la ventana, lo que nos permite simular nuestra propia barra de título.
delphi
interface uses  Windows, Messages, Classes, Forms; type  TForm1 = class(TForm)  private  public   procedure WMNCHitTest(var msg: TWMNCHitTest); message WM_NCHITTEST;  end; var  Form1: TForm1; implementation {$R *.DFM} procedure TForm1.WMNCHitTest(var msg: TWMNCHittest); var  pt: TPoint; begin  inherited;  pt := ScreenToClient(Point(msg.XPos, msg.YPos));  if PtInRect(Rect(0, 0, ClientWidth, 20), pt) then   msg.Result := HTCAPTION; end;