Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.09.25;
Скачать: CL | DM;

Вниз

Перетаскивание формы   Найти похожие ветки 

 
SergProger ©   (2005-08-31 01:07) [0]

Всем привет! Вот такая у меня опять проблема: есть процедура

procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;Shift: TShiftState; X, Y: Integer);
const
 SC_DragMove = $F012;
begin
 ReleaseCapture;
 perform(WM_SysCommand, SC_DragMove, 0);
end;

перетаскивание проичходит, но иногда(!) и правой кнопкой мыши можно перетащить, а когда вообще форма прилипает к курсору мыши, т.е. даже при отпущенной кнопке мыши форма не отстаёт от от курсора. Помогите доработать процедуру!


 
Джо ©   (2005-08-31 01:11) [1]


> и правой кнопкой мыши можно перетащить,

Ну, так if Button = mbLeft then.


 
SergProger ©   (2005-08-31 01:48) [2]

Джо, но заметь, что иногда, тем более, что не должно реагировать.


 
wicked ©   (2005-08-31 02:05) [3]

добрый совет - не заморачиваться с полулегальными-полудокументированными способами, а просто обрабатывать сообщение WM_NCHITTEST.... никогда не подводило....


 
SergProger ©   (2005-08-31 02:20) [4]

Пробовал, но не даёт вылезти PopupMemu. Посмотрите, может, опять чего-нибудь намудрил:

type
 TForm1 = class(TForm)
   ...
 private
   procedure DragWindow(var M: TWMNCHitTest); message WM_NCHitTest;
 public
 end;

implementation

procedure TForm1.DragWindow(var M: TWMNCHitTest);
begin
 inherited;
 if M.Result=htClient then
 M.Result:=htCaption;
end;


 
wicked ©   (2005-08-31 02:54) [5]

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

ЗЫ звиняйте за сумбур - спать охота очень.....


 
SergProger ©   (2005-08-31 05:12) [6]

Ладно, не обижаюсь, у самого глаза красные, можно сказать, мы - братья по "оружию", но исходный код стал выглядеть примерно так:

var
 DownButton: Boolean;
 Cur: TPoint;

procedure TForm1.FormMouseDown(...);
begin
 If Button=mbLeft then begin
   DownButton:=True;
   Cur.X:=X;
   Cur.Y:=Y;
 end;
end;

procedure TForm1.FormMouseUp(...);
begin
 DownButton:=False;
end;

procedure TForm1.FormMouseMove(...);
begin
 If DownButton then begin
   Form1.Left:=Form1.Left+X-Cur.X;
   Form1.Top:=Form1.Top+Y-Cur.Y;
 end;
end;

Работает отлично, без глюков и головной боли. Всем большое спасибо, тема закрыта.



Страницы: 1 вся ветка

Текущий архив: 2005.09.25;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.043 c
14-1125498070
hamster
2005-08-31 18:21
2005.09.25
Thumbs.db


1-1125568873
Jax
2005-09-01 14:01
2005.09.25
Поиск в строке


1-1125766173
PIF
2005-09-03 20:49
2005.09.25
Вызов формы из проекта в DLL


14-1125570789
dr Tr0jan
2005-09-01 14:33
2005.09.25
Хранение строки в памяти


6-1117704753
Marabunt
2005-06-02 13:32
2005.09.25
Файл FTPDemo.dpr