![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Перетащитиь форму не за заголовок [D7, WinXP]
parovoZZ © (2004-06-20 20:10:00)Как сделать сабж? SendMessage (Handle, WM_NCLButtonDown, HTCaption, 0) не подходит, потому как нужно ещё сделать вычисления, пока нажата кнопка мыши.
parovoZZ (2004-07-28 21:48:00) [1]Спасибо за SetCapture. Работает как часы. BillyJeans, ты настоящий друг.
BillyJeans (2004-07-28 12:31:00) [2]WM_MOUSEMOVE: If DownFlag then begin
GetCursorPos(mx); GetWindowRect(MainWnd, lpRect);
SetWindowPos(MainWnd, 0, lpRect.Left + (mx.x - LastPos.X), lpRect.Top + (mx.y - LastPos.Y), MainWidth, MainHeight, 0);
LastPos := mx;
end;
WM_LBUTTONUP: begin DownFlag := False; ReleaseCapture; end;
WM_LBUTTONDOWN: If not DownFlag then begin
DownFlag := True;
GetCursorPos(LastPos);
SetCapture(MainWnd);
end;
parovoZZ (2004-07-28 02:32:00) [3]Ну да, методом научного тыка. В ХР такой фокус проходит, а вот 98-ая встала в позу - приложение зависает.
Просто надо отловить сообщения (через состояние флага) при нажатии кнопки и при отпускании оной. На VCL всё делается без проблем, на апях же не проходит почему-то. Чтобы сгенерировалось сообщение об отпускании кнопки, надо её отпустить, потом опять нажать и быстро (!) отпустить.
В ХР такой фокус проходит, а вот 98-ая встала в позу - приложение зависает.
Игорь Шевченко (2004-07-27 23:35:00) [4]
> А что за информация в этом сообщении?
Класс! У тебя все работает, но ты не знаешь, что ты делаешь.
Аж завидно. Могу посоветовать использовать вместо $F040 другие константы, например, $F130 или $F140
parovoZZ (2004-07-27 23:11:00) [5]А что за информация в этом сообщении?
Игорь Шевченко (2004-07-27 21:58:00) [6]
> работает так, как надо, но не знаю, что за сообщение такое
> $F040?
SC_NEXTWINDOW
parovoZZ (2004-07-27 21:29:00) [7]Объвил так: SendMessage (Handle, WM_Syscommand, $F040, 0);
работает так, как надо, но не знаю, что за сообщение такое $F040?
parovoZZ (2004-06-26 15:39:00) [8]Всем спасибо.
Игорь Шевченко (2004-06-23 10:07:00) [9]
> И что такое SC_DRAGMOVE ?
$F012 = SC_DRAGMOVE ($F010) + HTCAPTION ($0002)
AlexZ_CRC (2004-06-23 02:23:00) [10]
WM_LButtonDown:
begin
if msg=Control_ID then
begin
SendMessage(<Хэндл окна>, WM_SYSCOMMAND, $F012, 0);
MessageBox(<Хэндл окна>,'Вы отпустили кнопку мыши','',MB_OK);
end;
end;
Упрощённо, примерно так.
GuAV (2004-06-23 01:51:00) [11]
> Да, я верю, что SC_DRAGMOVE+HTCAPTION посланное нужному
> окну отработает корректно.
я вообще-то про то что во вставленных окнах надо на WM_NCHITTEST вернуть не HTCAPTION, а HTTRANSPARENT...
И что такое SC_DRAGMOVE ?
Игорь Шевченко (2004-06-23 01:29:00) [12]
> Кроме того, если на VCL, то назначить всем один OnMouseDown
> - проще чем подменять их оконные процедуры
Разумеется
> Но всё же для контролов обрабатывать надо Вашим способом
> по-другому, а через WM_LButtonDown - точно так же.
Да, я верю, что SC_DRAGMOVE+HTCAPTION посланное нужному окну отработает корректно.
GuAV (2004-06-22 23:33:00) [13][12] Нет, прийдёт окну того контрола. Но всё же для контролов обрабатывать надо Вашим способом по-другому, а через WM_LButtonDown - точно так же.
Кроме того, если на VCL, то назначить всем один OnMouseDown - проще чем подменять их оконные процедуры.
Игорь Шевченко (2004-06-22 15:50:00) [14]GuAV © (22.06.04 15:41)
> и если на форме есть еще TWinControl, за которые тоже надо
> таскать форму, то [9] проще
А что, если есть контрол, за который надо таскать, то при нажатии мышиной клавиши WM_LButtonDown придет форме, а не этому контролу ?
GuAV (2004-06-22 15:41:00) [15]Игорь Шевченко © (22.06.04 14:53) [10]
imho [9] лучше чем [10], т.к. при [10] например у лабелов хинтов не видно, и если на форме есть еще TWinControl, за которые тоже надо таскать форму, то [9] проще.
Игорь Шевченко (2004-06-22 14:53:00) [16]WM_NCHITTEST :
...
if .... then
Result := HTCAPTION
...
AlexZ_CRC (2004-06-22 14:25:00) [17]// Проблема в том, что сообщение WM_LButtonDown отлавливается и я делаю всё, что нужно, но при отпускании кнопки сообщение WM_LButtonUp игнорируется окном. Не могу понять почему.
Проверь такой пример:
WM_LButtonDown:
begin
SendMessage(<Хэндл окна>, WM_SYSCOMMAND, $F012, 0);
MessageBox(<Хэндл окна>,'Вы отпустили кнопку мыши','',MB_OK);
end;
Удачи!
parovoZZ (2004-06-21 19:17:00) [18]Если это так:
WM_NCHITTEST :,
begin
SendMessage (Handle, WM_NCLButtonDown, HTCaption, 0);
end;
то перестаёт огтлавливатся сообщение от правой кнопки.
Игорь Шевченко (2004-06-21 10:34:00) [19]в обработке WM_NCHITTEST, возвращай HTCAPTION в той области, за которую надо таскать
parovoZZ (2004-06-21 03:09:00) [20]//> [3] parovoZZ © (20.06.04 20:42)
>Позвольте, но где вы видите не API в ответе grom?
------------------
Прсото он успел вперёд меня написать ответ.
Вообщем что нужно: пока нажата левая кнопка мышки, должен быть взведён некий флаг (true), как только кнопка отпускается, флаг сбрасывается (false).