Форум: "Основная";
Текущий архив: 2005.09.25;
Скачать: [xml.tar.bz2];
ВнизПеретаскивание формы Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.04 c