Выберите элемент управления (или саму форму) и напишите это в его (ее) обработчике события OnMouseDown (данный пример дан только для формы): procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin ReleaseCapture; Perform ( WM_SYSCOMMAND, SC_MOVE+2, 0 ); end; Классно! Намного проще метода NCHitTest, который я предлага. Хотя многое из того, чтобы вы мне написали, я не понял. Для чего нужно прибавлять 2 к параметру SC_MOVE? В справке по API об этом ничего не сказано. Ну хорошо, есть недокументированный способ сообщить Windows о необходимости перемещения окна таким же способом, что и с помощью заголовка (это может вызвать неадекватную реакцию системы, не делайте этого!). Другим способом перемещения окна является перекрытие WMNCHITTEST и возвращения им значения HTCAPTION. Тем не менее, обычно я предпочитаю пользоваться методом SC_MOVE+2, поскольку он не требует создания потомков, а только создание обработчика OnMouseDown. Отчасти аналогично, вы можете добавлять константы SC_SIZE к WM_SYSCOMMAND для получения размера окна подобно тому, как если бы вы потянули его за бордюрчик. В основном мы добавляем код hittest - 9. В следующем классе определена панель, которая сама изменяет свои размеры при щелчке в ее нижнем правом углу, и сама перемещается, если вы щелкнули по ней где-то еще. Type TMovablePanel = Class ( TPanel ) Private Procedure wmNCHitTest ( Var Message : TWMNCHitTest ); message WM_NCHITTEST; Protected Procedure MouseDown ( Button : TMouseButton; Shift : TShiftState; X, Y : Integer ); override; End; Procedure TMovablePanel.wmNCHitTest ( Var Message : TWMNCHitTest ); Begin With Message, ScreenToClient ( Pos ) Do If ( X < Width - 10 ) And ( Y < Height - 10 ) Then Message.Result := HTCAPTION Else Message.Result := HTCLIENT; End;
Procedure TMovablePanel.MouseDown ( Button : TMouseButton; Shift : TShiftState; X, Y : Integer ); Begin If Button = mbLeft Then Begin ReleaseCapture; Perform ( WM_SYSCOMMAND, SC_SIZE + HTBOTTOMRIGHT - 9, 0 ); End Else Inherited MouseDown ( Button, SHift, X, Y ); End; |