Форум: "WinAPI";
Текущий архив: 2004.09.12;
Скачать: [xml.tar.bz2];
ВнизПеретащитиь форму не за заголовок Найти похожие ветки
← →
parovoZZ © (2004-06-20 20:10) [0]Как сделать сабж? SendMessage (Handle, WM_NCLButtonDown, HTCaption, 0) не подходит, потому как нужно ещё сделать вычисления, пока нажата кнопка мыши.
← →
}{enon © (2004-06-20 20:22) [1]Может так получится:
var //interface
d: boolean;
x0,y0: integer;
procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
d := true;
x0 := x;
y0 := y;
end;
procedure TForm1.FormMouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
d := false;
end;
procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
if d then
begin
Left := Left + x - x0;
Top := Top + y - y0;
end;
end;
← →
grom (2004-06-20 20:37) [2]procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
ReleaseCapture;
Perform(WM_SYSCOMMAND, $F012, 0);
end;
← →
parovoZZ © (2004-06-20 20:42) [3]Да не, нужно на апях. Проблема в том, что сообщение WM_LButtonDown отлавливается и я делаю всё, что нужно, но при отпускании кнопки сообщение WM_LButtonUp игнорируется окном. Не могу понять почему.
← →
Rouse_ © (2004-06-20 21:14) [4]> [3] parovoZZ © (20.06.04 20:42)
Позвольте, но где вы видите не API в ответе grom?
← →
GuAV © (2004-06-20 21:15) [5]
> Да не, нужно на апях
А на апях
> Perform(WM_SYSCOMMAND, $F012, 0);
становится SendMessage, тока и всего.
← →
parovoZZ © (2004-06-21 03:09) [6]//> [3] parovoZZ © (20.06.04 20:42)
>Позвольте, но где вы видите не API в ответе grom?
------------------
Прсото он успел вперёд меня написать ответ.
Вообщем что нужно: пока нажата левая кнопка мышки, должен быть взведён некий флаг (true), как только кнопка отпускается, флаг сбрасывается (false).
← →
Игорь Шевченко © (2004-06-21 10:34) [7]в обработке WM_NCHITTEST, возвращай HTCAPTION в той области, за которую надо таскать
← →
parovoZZ © (2004-06-21 19:17) [8]Если это так:
WM_NCHITTEST :
,
begin
SendMessage (Handle, WM_NCLButtonDown, HTCaption, 0);
end;
то перестаёт огтлавливатся сообщение от правой кнопки.
← →
AlexZ_CRC (2004-06-22 14:25) [9]// Проблема в том, что сообщение WM_LButtonDown отлавливается и я делаю всё, что нужно, но при отпускании кнопки сообщение WM_LButtonUp игнорируется окном. Не могу понять почему.
Проверь такой пример:
WM_LButtonDown:
begin
SendMessage(<Хэндл окна>, WM_SYSCOMMAND, $F012, 0);
MessageBox(<Хэндл окна>,"Вы отпустили кнопку мыши","",MB_OK);
end;
Удачи!
← →
Игорь Шевченко © (2004-06-22 14:53) [10]WM_NCHITTEST :
...
if .... then
Result := HTCAPTION
...
← →
GuAV © (2004-06-22 15:41) [11]Игорь Шевченко © (22.06.04 14:53) [10]
imho [9] лучше чем [10], т.к. при [10] например у лабелов хинтов не видно, и если на форме есть еще TWinControl, за которые тоже надо таскать форму, то [9] проще.
← →
Игорь Шевченко © (2004-06-22 15:50) [12]GuAV © (22.06.04 15:41)
> и если на форме есть еще TWinControl, за которые тоже надо
> таскать форму, то [9] проще
А что, если есть контрол, за который надо таскать, то при нажатии мышиной клавиши WM_LButtonDown придет форме, а не этому контролу ?
← →
GuAV © (2004-06-22 23:33) [13][12] Нет, прийдёт окну того контрола. Но всё же для контролов обрабатывать надо Вашим способом по-другому, а через WM_LButtonDown - точно так же.
Кроме того, если на VCL, то назначить всем один OnMouseDown - проще чем подменять их оконные процедуры.
← →
Игорь Шевченко © (2004-06-23 01:29) [14]
> Кроме того, если на VCL, то назначить всем один OnMouseDown
> - проще чем подменять их оконные процедуры
Разумеется
> Но всё же для контролов обрабатывать надо Вашим способом
> по-другому, а через WM_LButtonDown - точно так же.
Да, я верю, что SC_DRAGMOVE+HTCAPTION посланное нужному окну отработает корректно.
← →
GuAV © (2004-06-23 01:51) [15]
> Да, я верю, что SC_DRAGMOVE+HTCAPTION посланное нужному
> окну отработает корректно.
я вообще-то про то что во вставленных окнах надо на WM_NCHITTEST вернуть не HTCAPTION, а HTTRANSPARENT...
И что такое SC_DRAGMOVE ?
← →
AlexZ_CRC (2004-06-23 02:23) [16]
WM_LButtonDown:
begin
if msg=Control_ID then
begin
SendMessage(<Хэндл окна>, WM_SYSCOMMAND, $F012, 0);
MessageBox(<Хэндл окна>,"Вы отпустили кнопку мыши","",MB_OK);
end;
end;
Упрощённо, примерно так.
← →
Игорь Шевченко © (2004-06-23 10:07) [17]
> И что такое SC_DRAGMOVE ?
$F012 = SC_DRAGMOVE ($F010) + HTCAPTION ($0002)
← →
parovoZZ © (2004-06-26 15:39) [18]Всем спасибо.
← →
parovoZZ © (2004-07-27 21:29) [19]Объвил так: SendMessage (Handle, WM_Syscommand, $F040, 0);
работает так, как надо, но не знаю, что за сообщение такое $F040?
← →
Игорь Шевченко © (2004-07-27 21:58) [20]
> работает так, как надо, но не знаю, что за сообщение такое
> $F040?
SC_NEXTWINDOW
← →
parovoZZ © (2004-07-27 23:11) [21]А что за информация в этом сообщении?
← →
Игорь Шевченко © (2004-07-27 23:35) [22]
> А что за информация в этом сообщении?
Класс! У тебя все работает, но ты не знаешь, что ты делаешь.
Аж завидно. Могу посоветовать использовать вместо $F040 другие константы, например, $F130 или $F140
← →
parovoZZ © (2004-07-28 02:32) [23]Ну да, методом научного тыка. В ХР такой фокус проходит, а вот 98-ая встала в позу - приложение зависает.
Просто надо отловить сообщения (через состояние флага) при нажатии кнопки и при отпускании оной. На VCL всё делается без проблем, на апях же не проходит почему-то. Чтобы сгенерировалось сообщение об отпускании кнопки, надо её отпустить, потом опять нажать и быстро (!) отпустить.
В ХР такой фокус проходит, а вот 98-ая встала в позу - приложение зависает.
← →
BillyJeans (2004-07-28 12:31) [24]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 21:48) [25]Спасибо за SetCapture. Работает как часы. BillyJeans, ты настоящий друг.
Страницы: 1 вся ветка
Форум: "WinAPI";
Текущий архив: 2004.09.12;
Скачать: [xml.tar.bz2];
Память: 0.5 MB
Время: 0.04 c