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

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

Теоретический вопрос по перемещению окон. [D6]


Суслик ©   (2005-08-24 18:33:00) 

Тут в "основной" был вопрос http://www.delphimaster.ru/cgi-bin/forum.pl?id=1124886439&n=0

Поясните пожалуйста кто знает:
1) как сделать задачу проще
2) WMSysCommand Message.CmdType = 61458, хотя вроде бы должно быть SC_MOVE, а это равно 61456.


Игорь Шевченко   (2005-08-25 09:36:00) [1]

Турист   (24.08.05 21:25) [18]

А кто-то мешает это сделать ? Я не вижу проблемы


wicked   (2005-08-24 21:52:00) [2]

> Сдается мне (точно не уверен), что в зависимости от
> системного параметра "Show window contents while
> dragging" окнам посылаются разные сообщения.
хм... мне иногда кажется, что здесь MS решила поступить проще и после каждого посланного WM_MOVING при установленном флажке тут же посылается WM_MOVE... т. о., программы, которые ничего не знают об этой опции, будут корректно работать... правда, при этом, притормаживать на прорисовках, что, кстати, и наблюдается, начиная с Windows 95 с установленным plus...


Турист   (2005-08-24 21:25:00) [3]

>Игорь Шевченко ©   (24.08.05 19:04) [17]
Есть предположение, что Child может быть в любом месте, но при перемещении fMain Child должен перемещаться в том же направлении :-)


Игорь Шевченко   (2005-08-24 19:04:00) [4]

Суслик ©   (24.08.05 18:55) [12]


> Но в процессе перемещения ты же должен знать на сколько
> сместилась форма для того, чтобы на эту же delta сместить
> вторую форму? Т.е. тебе надо знать начало перемещения


А зачем ?

Вот так оно перемещает синхронно обе формы, вне зависимости от состояния Show Window Contents

unit main;

interface

uses
 Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
 StdCtrls;

type
 TfMain = class(TForm)
   cbSyncMoving: TCheckBox;
 private
   procedure WMMove (var Message: TWmMove);
     message WM_MOVE;
   procedure WMMoving (var Message: TMessage);
     message WM_MOVING;
   procedure UpdateChildPos;
   procedure UpdateChildRect (const Rect: TRect);
 end;

var
 fMain: TfMain;

implementation
uses
 Child;

{$R *.DFM}

{ TfMain }

procedure TfMain.UpdateChildPos;
begin
 if Assigned(fChild) then begin
   fChild.Left := Left;
   fChild.Top := Top + Height;
 end;
end;

procedure TfMain.UpdateChildRect(const Rect: TRect);
begin
 if Assigned(fChild) then begin
   fChild.Left := Rect.Left;
   fChild.Top := Rect.Top + Height;
 end;
end;

procedure TfMain.WMMove(var Message: TWmMove);
begin
 inherited;
 UpdateChildPos;
end;

procedure TfMain.WMMoving(var Message: TMessage);
begin
 inherited;
 if cbSyncMoving.Checked then
   UpdateChildRect (PRect(Message.LParam)^);
end;

end.


Суслик   (2005-08-24 19:03:00) [5]

Ладно, спасибо. Узнал что-то новое, есть что почитать. :)


Суслик   (2005-08-24 19:02:00) [6]

В общем, вроде понял. Действительно можно не запоминать.


Игорь Шевченко   (2005-08-24 19:00:00) [7]

если установлена опция Show Window Contents while dragging,
то мой код вызывает синхронное перемещение обоих форм. Кстати.


begin...end   (2005-08-24 18:58:00) [8]

> Суслик ©   (24.08.05 18:55) [12]

> Но в процессе перемещения ты же должен знать на сколько сместилась форма...

Зачем?


Суслик   (2005-08-24 18:55:00) [9]


> Постом выше я задал вопрос, какое поведение требуется, но
> в первом случае (когда обе формы двигаются синхронно), я
> бы стал отлеживать не начало, а процесс перемещения.

Но в процессе перемещения ты же должен знать на сколько сместилась форма для того, чтобы на эту же delta сместить вторую форму? Т.е. тебе надо знать начало перемещения.


Игорь Шевченко   (2005-08-24 18:53:00) [10]

Суслик ©   (24.08.05 18:49) [8]

А зачем мне отслеживать именно начало перемещения ? Постом выше я задал вопрос, какое поведение требуется, но в первом случае (когда обе формы двигаются синхронно), я бы стал отлеживать не начало, а процесс перемещения.


Суслик   (2005-08-24 18:52:00) [11]

Имеется в виду первое - когда двигаешь первое окно, синхронно (т.е. на тот же вектор) двигается второе.

Ты бы как все-таки [8] стал делать?


Игорь Шевченко   (2005-08-24 18:51:00) [12]

Суслик ©   (24.08.05 18:46) [7]


> Не... лучше wm_syscommand - т.к. посылается только один
> раз, в начале перемещения.
>
> А WM_MOVING посылвается всегда.


И чем лучше ? Я вот честно не понимаю. Какое совместное перемещение имеется в виду - обе формы одновременно перемещаются по экрану в процессе перемещения или вторая форма оказывается рядом с первой по окончании перемещения ? Сдается мне (точно не уверен), что в зависимости от системного параметра "Show window contents while dragging" окнам посылаются разные сообщения.


Суслик   (2005-08-24 18:49:00) [13]


> [6] Игорь Шевченко ©   (24.08.05 18:39)

А как бы ты стал wm_moving отслеживать начало перемещения?


Суслик   (2005-08-24 18:46:00) [14]


> Так TFM надо внимательно читать.
>
> Command := wParam and $FFF0

А... точно:)


> WM_MOVING ?

Не... лучше wm_syscommand - т.к. посылается только один раз, в начале перемещения.

А WM_MOVING посылвается всегда.


Игорь Шевченко   (2005-08-24 18:39:00) [15]


> Но нужно же для начала отследить начало перемещения окна


WM_MOVING ?

"The WM_MOVING message is sent to a window that the user is moving. By processing this message, an application can monitor the size and position of the drag rectangle and, if needed, change its size or position."


> Почему CmdType иной, чем описан в MSDN.


Так TFM надо внимательно читать.

Command := wParam and $FFF0

В младших четырех битах содержится значение HitTest, которое вызвало выполнение WM_SYSCOMMAND.


begin...end   (2005-08-24 18:38:00) [16]

> Суслик ©   (24.08.05 18:33)

> хотя вроде бы должно быть SC_MOVE

Не должно.


Суслик   (2005-08-24 18:37:00) [17]

Там вопрос в другом был - одновременное перемещение на тот же вектор. Т.е. нужно отловить начало перемещения.


Игорь Шевченко   (2005-08-24 18:36:00) [18]

unit main;

interface

uses
 Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs;

type
 TfMain = class(TForm)
 private
   procedure WMMove (var Message: TWmMove);
     message WM_MOVE;
   procedure UpdateChildPos;
 end;

var
 fMain: TfMain;

implementation
uses
 Child;

{$R *.DFM}

{ TfMain }

procedure TfMain.UpdateChildPos;
begin
 if Assigned(fChild) then begin
   fChild.Left := Left;
   fChild.Top := Top + Height;
 end;
end;

procedure TfMain.WMMove(var Message: TWmMove);
begin
 inherited;
 UpdateChildPos;
end;

end.


Суслик   (2005-08-24 18:36:00) [19]


>  [1] Игорь Шевченко ©   (24.08.05 18:34)

Ну так и делаю.
Но нужно же для начала отследить начало перемещения окна. Я делаю через реакцию на WM_SYSCOMMAND. Почему CmdType иной, чем описан в MSDN.


Игорь Шевченко   (2005-08-24 18:34:00) [20]


> 1) как сделать задачу проще


Реагировать на WM_MOVE ?


Наверх

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