[Back to DELPHI SWAG index] [Back to Main SWAG index] [Original]
{
Q: How can I make a form move by clicking and dragging in the client area
   instead of on the caption bar?
A: The easiest way to do this is to "fool" Windows into thinking that
   you're actually clicking on the caption bar of a form.  Do this by
   handling the wm_NCHitTest windows message as shown in the sample unit
   below.
   TIP: If you want a captioness borderless window similar to a floating
   toolbar, set the Form's Caption to an empty string, disable all of the
   BorderIcons, and set the BorderStyle to bsNone.
}
unit Dragmain;
interface
uses
  SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls,
  Forms, Dialogs, StdCtrls;
type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    procedure WMNCHitTest(var M: TWMNCHitTest); message wm_NCHitTest;
  end;
var
  Form1: TForm1;
implementation
{$R *.DFM}
procedure TForm1.WMNCHitTest(var M: TWMNCHitTest);
begin
  inherited;                    { call the inherited message handler }
  if  M.Result = htClient then  { is the click in the client area?   }
    M.Result := htCaption;      { if so, make Windows think it's     }
                                { on the caption bar.                }
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
  Close;
end;
end.
{ The text representation of the .DFM file is below:
object Form1: TForm1
  Left = 203
  Top = 94
  BorderIcons = []
  BorderStyle = bsNone
  ClientHeight = 273
  ClientWidth = 427
  Font.Color = clWindowText
  Font.Height = -13
  Font.Name = 'System'
  Font.Style = []
  PixelsPerInch = 96
  TextHeight = 16
  object Button1: TButton
    Left = 160
    Top = 104
    Width = 89
    Height = 33
    Caption = 'Close'
    TabOrder = 0
    OnClick = Button1Click
  end
end
}
[Back to DELPHI SWAG index] [Back to Main SWAG index] [Original]