Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Перетащитиь форму не за заголовок [D7, WinXP]


Страницы:   1 2

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).


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо