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

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

Использование мыши для перемещения окна [D7, WinXP]


wiln ©   (2006-08-13 07:56:00) 

Проблема:  В обработчике OnMouseMove вызавается функция MoveWindow. procedure TForm1.OnMOuseMove(Sender: TObject; Shift: TShiftState; X,
 Y: Integer);
 var
   Point: TPoint;
begin
 if(FlagDown = TRUE)
 then
 begin
   Point.X := X;
   Point.Y := Y;
   ClientToScreen(Point);
{   R[i]:= Point;
   i:= i + 1;       }
   MoveWindow(HANDLE, Point.X, Point.Y, Form1.Height, Form1.Width, TRUE);
 end;
    При движении мыши перетаскиваемое окно  сильно скачет по экрану. Что не так?


Ketmar   (2006-08-13 17:53:00) [1]

> [14] DprYg ©   (13.08.06 17:47)
да фиг с ним. самому стало лениво дальше бодаться. попил пива... %-)


DprYg   (2006-08-13 17:47:00) [2]

Ketmar ©   (13.08.06 14:55) [10]
Первый параметр сообщения WM_SYSCOMMAND говорит, что форма находится в состоянии перетаскивания. Если его изменить, например на $F001, то можно будет изменять размер. Второй параметр обработчиком сообщения не используется - можете набрать например 173917298. ReleaseCapture освобождает мышь и связана с событием onMouseMove.  Насчет того, что правая кнопка не работает - объясните мне, пожалуйста. Вряд ли я автор - ведь [5], [6] сказали именно вы.
P.S. (to Ketmar) настаиваю на прекращении словесной перепалки...:) Мир?


ANTPro   (2006-08-13 17:15:00) [3]

Ketmar ©   (13.08.06 16:47) [12]
Я тоже знаю, но по моему код с SetCapture() будет НЕ оптимальным решением.


Ketmar   (2006-08-13 16:47:00) [4]

> [11] ANTPro ©   (13.08.06 16:39)
лично яэто знаю. а вот знает ли автор "наезда"? сильно сомневаюсь.


ANTPro   (2006-08-13 16:39:00) [5]

Ketmar ©   (13.08.06 14:55) [10]
да? разобрались? заодно и протелепатировали, что мне этот код незнаком? тогда скажите, что это за число такое -- $F012? зачем оно там именно такое? почему второй параметр 0? зачем там ReleaseCapture(), и почему именно там? почему этот код не работает для правой кнопки?

MSDN отказалась тебе подавать?


Ketmar   (2006-08-13 14:55:00) [6]

> [8] DprYg ©   (13.08.06 14:21)
да? разобрались? заодно и протелепатировали, что мне этот код незнаком? тогда скажите, что это за число такое -- $F012? зачем оно там именно такое? почему второй параметр 0? зачем там ReleaseCapture(), и почему именно там? почему этот код не работает для правой кнопки?

> [9] ANTPro ©   (13.08.06 14:29)
MSDN подаст.


ANTPro   (2006-08-13 14:29:00) [7]

Ketmar ©   (13.08.06 11:49) [5]
Код с SetCapture не прокатывает по крайней мере у меня, может покажешь как надо пользовать ?


DprYg   (2006-08-13 14:21:00) [8]


> онять скопировали код из какого-то фака, а понять, как и
> почему работает -- не удосужилдись?

Да, действительно, это код из какого-то фака. И копировать мне его не обязательно - для меня запомнить две строчки кода - не проблема. Во всяком случае меньшая, чем писать что-то типа [0]. Насчет того, что я не разбирался как и почему работает, вопрос: это из чего и откуда следует что я этого не сделал? И вообще, каждому (в том числе и Вам) желательно разбираться в незнакомом коде, а не голословно отмахиваться от него.

> как обычно. а кокретно этот пример как вирус распространился.

А почему этот пример так распространился? Ведь не только оттого что вопросы появляются? И еще: под как обычно Вы что подразумеваете?


KilkennyCat   (2006-08-13 13:23:00) [9]

как обычно. а кокретно этот пример как вирус распространился.


Ketmar   (2006-08-13 11:50:00) [10]

вдогон: онять скопировали код из какого-то фака, а понять, как и почему работает -- не удосужилдись?


Ketmar   (2006-08-13 11:49:00) [11]

> [4] DprYg ©   (13.08.06 10:01)
изувер. SetCapture() для кого придумано?


DprYg   (2006-08-13 10:01:00) [12]

procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
 Shift: TShiftState; X, Y: Integer);
begin
  if Button = mbLeft then begin
   ReleaseCapture;
   Form1.Perform(WM_SYSCOMMAND, $F012, 0);
 end;
end;

И вще в Object Inspector надо в OnMouseDown всех оконных компонентов, за которые можно буксировать, сделать ссылку на FormMouseDown.


ANTPro   (2006-08-13 09:46:00) [13]

procedure TForm1.KOLFormMouseDown(Sender: PControl;
 var Mouse: TMouseEventData);
begin
 if Mouse.Button=mbLeft then//обязательно левая
 begin
     ReleaseCapture;
     SendMessage(Form.Handle,WM_SYSCOMMAND,$F012,0);
 end;
end;


KilkennyCat   (2006-08-13 08:03:00) [14]

и еще... возможно, TShiftState избавит от FlagDown? И кстати,
> if(FlagDown = TRUE)
> then

это все равно, что "если масло - масляное, то..."...
достаточно  if FlagDown then


KilkennyCat   (2006-08-13 08:01:00) [15]

координаты не абсолютны, привязаны к форме... обратная связь получается, возбуждение, "завязка"... используйте глобальные коордианты и будет Вам сячастье, а я - спать нафиг...


Наверх

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