Перемещение формы не за заголовок. Вариант 4

Выберите элемент управления (или саму форму) и напишите это в его (ее) обработчике события 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;

 
« Предыдущая статья   Следующая статья »