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

Вниз

Теоретический вопрос по перемещению окон.   Найти похожие ветки 

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

Тут в "основной" был вопрос http://delphimaster.net/view/1-1124886439/

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


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


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


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


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


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

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


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

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:37) [4]

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


 
begin...end ©   (2005-08-24 18:38) [5]

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

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

Не должно.


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


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


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.


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


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

А... точно:)


> WM_MOVING ?

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

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


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


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

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


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

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


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


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


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

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

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


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

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

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


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


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

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


 
begin...end ©   (2005-08-24 18:58) [13]

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

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

Зачем?


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

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


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

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


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

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


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

Суслик ©   (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 21:25) [18]

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


 
wicked ©   (2005-08-24 21:52) [19]

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


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

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

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



Страницы: 1 вся ветка

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

Наверх




Память: 0.52 MB
Время: 0.03 c
3-1127359637
V-A-V
2005-09-22 07:27
2005.10.30
Пароль на MDB


3-1127215268
Patrick
2005-09-20 15:21
2005.10.30
BDE и Microsoft Windows Server 2003


2-1128674268
Денис
2005-10-07 12:37
2005.10.30
Обратный результат.


1-1128924102
apellido
2005-10-10 10:01
2005.10.30
Почему не вижу на экране динамически созданные кнопки, метки...


1-1128454553
Студент :(((
2005-10-04 23:35
2005.10.30
Х в N степени