Советы по Delphi

         

Перемещение формы не за заголовок IV


Как мне переместить форму, не имеющую заголовка?

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

- Robert Wittig [001113]



Содержание раздела