Przenoszenia formularza klinaniem w jego dowolnym punkcie

I sposób:

Aby umożliwić użytkownikowi przeciąganie formularza, gdy kliknie on w jego dowolnym miejscu przechwycimy komunikat WM_NCHITTEST (wysyłany do formularza, gdy wskaźnik myszy zmienia swoje położenie, albo gdy zostanie wciśnięty lub puszczony przycisk myszy) i w funkcji obsługującej go sprawdzimy, czy użytkownik kliknął w obszarze formularza, a jeśli tak to "oszukamy" formularz i przekażemy mu, że użytkownik jednak kliknął na pasku tytułu formularza, a nie w obszarze formularza. Tworzymy więc w pliku nagłówkowym formularza deklarację funkcji obsługującej komunikat i mapę komunikatu:

Unit1.h

public:
   void __fastcall DontMoveIt(TMessage &Msg);

BEGIN_MESSAGE_MAP
   MESSAGE_HANDLER(WM_NCHITTEST, TMessage, MoveIt)
END_MESSAGE_MAP(TForm)

a w pliku formularza piszemy funkcję obsługującą komunikat:

Unit1.cpp

void __fastcall TForm1::MoveIt(TMessage &Msg)
{
   TForm::Dispatch(&Msg);
   if (Msg.Result == HTCLIENT)
      Msg.Result = HTCAPTION;
}

II sposób:

Prostszym sposobem przesuwania formularza przez kliknięcie w jego dowolnym punkcie jest obsłużenie zdarzenia OnMouseDown dla głównego formularza. W tym zdarzeniu za pomocą funkcji Windows API SendMessage() wysyłamy najpierw wiadomość, w celu oszukania Windowsa, że klawisz myszy, który został kliknięty w polu formularza został już puszczony, a następnie drugą wiadomość o kliknięciu myszą na pasku tytułu formularza co pozwala na jego przeciąganie:

Unit1.cpp

void __fastcall TForm1::FormMouseDown(TObject *Sender, TMouseButton Button, TShiftState Shift,                                       int X, int Y)
{
   if (Button == mbLeft)
   {
      SendMessage(Handle, WM_LBUTTONUP, 0, 0);
      SendMessage(Handle, WM_NCLBUTTONDOWN, HTCAPTION, 0);
   }
}