Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Перетаскивания формы


Автор: Spawn 3.1.2003, 18:01
Как можно определить, что форма перетаскивается за заголовок в текущий момент времени? Заранее благодарен.

Автор: Technoboss 4.1.2003, 01:55
Привет!

Может быть использовать ф-цию  GetClientRect ?

Автор: Vit 4.1.2003, 03:09
onPaint можно обрабатывать.

Автор: Medved 4.1.2003, 05:50
Можно через таймер, или обрабатывать OnMouseUp;

Автор: Spawn 4.1.2003, 17:48
Спасибо, но я сделал вот так:

private
 procedure NCMouseMove(var Msg: TMessage); message WM_NCMOUSEMOVE;


...
x:=GetSystemMetrics(SM_CXSIZE);
...

procedure TForm1.NCMouseMove(var Msg: TMessage);
begin
inherited;
if (msg.WParam=HTCAPTION) then
begin
Form2.Left:=Form1.Left-Form2.Width-20;
Form2.Top:=Form1.Top+X;
end;
end;

Мне нужно это для того чтобы одновременно перетаскивать 2 формы, но в етим способом вторая форма меняет свое положение только после того как я, перетащив первую форму, отпускаю кнопку мышки. Можно ли как то сделать, чтоб форма перетаскивалась одновременно с первой?

Автор: Spawn 6.1.2003, 19:26
Ну, плз, подскажите как сделать, чтобы обе формы перетаскивались одновременно.

Автор: jeka 6.1.2003, 20:11
При начале перетаскивания генерируется событие. Перехватываешь это событие и создаёшь таймер к примеру на 0.1 сек. и опрашиваешь положение окна и относительно полученных данных меняешь положение второго окна, а после перехвата события завершения перетаскивания окна таймер отключаешь...

вроде проще некуда...

Автор: jeka 6.1.2003, 20:14
Цитата(Vit @ 03.1.2003, 19:09)
onPaint можно обрабатывать.

OnPaint вызывается у меня в 4 случаях:
1. Изменение содержимого формы (обновляется только изменившаяся часть).
2. При выходе за пределы экрана.
3. При перекрытии другой формой.
4. По требованию системы (например при смене цветовой гаммы).

Автор: neutrino 6.1.2003, 21:21
Попробуй обработать следущие сообщения и напиши что-то вроде этого:

NC_LBUTTONDOWN:
 FormsDragging := True;
 XOffset := X;
 YOffset := Y;

NC_LBUTTONUP:
 FormsDragging := False;

NC_MOUSEMOVE:
 if FormsDragging then
 begin
   OtherForm.Left := (OtherForm.Left+X)-XOffset;
   OtherForm.Top := (OtherForm.Top+Y)-YOffset;
 end;

OtherForm - это вторая форма. Переменные FormsDragging, XOffset, YOffset oбъяви глобально.

P.S. See also WM_MOVE


Автор: Spawn 11.1.2003, 08:33
Цитата(neutrino @ 06.1.2003, 13:21)
Попробуй обработать следущие сообщения и напиши что-то вроде этого:

NC_LBUTTONDOWN:
 FormsDragging := True;
 XOffset := X;
 YOffset := Y;

NC_LBUTTONUP:
 FormsDragging := False;

NC_MOUSEMOVE:
 if FormsDragging then
 begin
   OtherForm.Left := (OtherForm.Left+X)-XOffset;
   OtherForm.Top := (OtherForm.Top+Y)-YOffset;
 end;

OtherForm - это вторая форма. Переменные FormsDragging, XOffset, YOffset oбъяви глобально.

P.S. See also WM_MOVE

Сообщение WM_NCMOUSEMOVE наступает только тогда, когдя я, перетащив форму, отпускаю кнопку мышки. Мне же жедательно сделать так, чтобы перетаскиванее было одновременным, как это сделано, например, в Winamp.
Если же ставить таймер во второй форме на проверку нажатия на заголовок в первой форме и при этом нажатии перемещать вторую форму, то при загруженности системы, перетаскивание второй формы происходит рывками.

Автор: stab 12.1.2003, 06:09
...
 private
   { Private declarations }
   procedure WMMOVE(var Msg: TMessage); message WM_MOVE;
....


procedure TForm1.FormShow(Sender: TObject);
begin
 Form2.Show;
end;

procedure TForm1.WMMOVE(var Msg: TMessage);
begin
 inherited;
 if (Form2 <> nil) and (Form2.Visible) then begin
   SetWindowPos(Form2.Handle, 0, Msg.LParamLo - Form1.Width, Msg.LParamHi, 0, 0, SWP_NOSIZE or SWP_NOACTIVATE);
 end;
end;

все прекрасно работает

Автор: stab 12.1.2003, 06:12
Form2.Visible не обязательно -- это так иссделования и еще если отключен "показ содержимого окна при перетаскивании" этот код не канает

Автор: Dayana 12.1.2003, 22:59
Хорошо обрабатывать сообщение WM_MOVING
http://www.forum.vingrad.ru/cgi-bin/newforum/ikonboard.cgi?act=ST;f=2;t=4344

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)