Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
2-1124015030
Гость22
2005-08-14 14:23
2005.09.25
И еше вопрос.


14-1125301123
Ермак
2005-08-29 11:38
2005.09.25
Линия в 500 м


1-1125387238
Darmidon
2005-08-30 11:33
2005.09.25
Свернуть все окна + Shell32.dll


2-1124229284
Просьба
2005-08-17 01:54
2005.09.25
Как отследить уход мыши с TImage?


14-1125430963
iZEN
2005-08-30 23:42
2005.09.25
Checked-exceptions, добро или зло?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский