| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > 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 | ||
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 | ||
Сообщение 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 |