Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.09.12;
Скачать: CL | DM;

Вниз

Перетащитиь форму не за заголовок   Найти похожие ветки 

 
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 вся ветка

Текущий архив: 2004.09.12;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.022 c
14-1093336923
Dmitry_
2004-08-24 12:42
2004.09.12
Где можно скачать Delphi5?


6-1089068198
RaPToR_1
2004-07-06 02:56
2004.09.12
сокет в компоненте


3-1092596419
3APA3A
2004-08-15 23:00
2004.09.12
Блокировка записей в FireBird 1.5


1-1093638711
ИМХО
2004-08-28 00:31
2004.09.12
CLSIDFromProgID и Аутлук


6-1089278123
Iraizor
2004-07-08 13:15
2004.09.12
Вопрос про Сокеты и размер блока