![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Перетаскивание формы [D7, WinME]
SergProger © (2005-08-31 01:07:00)Всем привет! Вот такая у меня опять проблема: есть процедура
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;
перетаскивание проичходит, но иногда(!) и правой кнопкой мыши можно перетащить, а когда вообще форма прилипает к курсору мыши, т.е. даже при отпущенной кнопке мыши форма не отстаёт от от курсора. Помогите доработать процедуру!
SergProger (2005-08-31 05:12:00) [1]Ладно, не обижаюсь, у самого глаза красные, можно сказать, мы - братья по "оружию", но исходный код стал выглядеть примерно так:
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;
Работает отлично, без глюков и головной боли. Всем большое спасибо, тема закрыта.
wicked (2005-08-31 02:54:00) [2]ясен пень, что не даст... что код делает то?... проверяет, находится ли мышь над клиентской областью, и если это так, то возвращает системе, что курсор то над заголовком...
решения - системные:
1) сделать "пятна" на форме, где обработчик сообщения для курсора, находящегося над клиентской частью формы, будет честно об этом сообщать виндовсу.....
2) ловить и обрабатывать самостоятельно клики правой кнопкой мыши... требует заведения флажка "настоящий-хит-код-который-нам-вернули"... соотв., обработчик кликов правой кнопкой должен проверять этот флажок на то, действительно ли курсор мыши находился над клиентской частью формы....
ЗЫ звиняйте за сумбур - спать охота очень.....
SergProger (2005-08-31 02:20:00) [3]Пробовал, но не даёт вылезти 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:05:00) [4]добрый совет - не заморачиваться с полулегальными-полудокументированными способами, а просто обрабатывать сообщение WM_NCHITTEST.... никогда не подводило....
SergProger (2005-08-31 01:48:00) [5]Джо, но заметь, что иногда, тем более, что не должно реагировать.
Джо (2005-08-31 01:11:00) [6]
> и правой кнопкой мыши можно перетащить,
Ну, так if Button = mbLeft then.