Bien. Pero fíjate que puedes calcular directamente el area cliente sin necesidad de calcular los anchos de borde y de la barra del caption:
Esta sería la modificación en el tratamiento de mensaje de WM_MOVING:
Código Delphi
[-]
procedure TForm2.WMMoving(var Message: TWMMOVING);
var
MainRect: TRect;
begin
inherited;
Windows.GetClientRect(Application.MainForm.Handle, MainRect);
MapWindowPoints(Application.MainForm.Handle, 0, MainRect, 2);
if Message.DragRect.Left < MainRect.Left then
begin
Message.DragRect.Left:= MainRect.Left;
Message.DragRect.Right:= MainRect.Left + self.Width;
end;
if Message.DragRect.Top < MainRect.Top then
begin
Message.DragRect.Top:= MainRect.Top;
Message.DragRect.Bottom:= MainRect.Top + self.Height;
end;
if Message.DragRect.Left > MainRect.Right - self.Width then
begin
Message.DragRect.Left:= MainRect.Right - self.Width;
Message.DragRect.Right:= MainRect.Right;
end;
if Message.DragRect.Bottom > MainRect.Bottom then
begin
Message.DragRect.Top:= MainRect.Bottom - self.Height;
Message.DragRect.Bottom:= MainRect.Bottom;
end;
end;
Tratar el mensaje WM_MOVING es mejor que el OnMouseMove pues hace referencia al movimiento de la ventana, no del ratón, sea cual sea el mecanismo del movimiento (ratón o teclado) y se llama durante el movimiento continuo, no tras éste. Además es mas simple y rápido.
Saludos