Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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
1-1093919119
race1
2004-08-31 06:25
2004.09.12
TLabel


9-1084946112
Papai
2004-05-19 09:55
2004.09.12
Игра


14-1093100431
dzmitry[li]
2004-08-21 19:00
2004.09.12
Simens CF62


14-1093417548
Суслик
2004-08-25 11:05
2004.09.12
Статья из RSDN


1-1093530835
Кирилл
2004-08-26 18:33
2004.09.12
Ресурсы





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский