Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2005.10.30;
Скачать: [xml.tar.bz2];

Вниз

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

 
Суслик ©   (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 вся ветка

Форум: "WinAPI";
Текущий архив: 2005.10.30;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.5 MB
Время: 0.041 c
14-1128752557
ArchValentin
2005-10-08 10:22
2005.10.30
Проблема с процем intel celeron


1-1128521993
Aleksey
2005-10-05 18:19
2005.10.30
Image.Canvas и LineTo


2-1128423393
nk
2005-10-04 14:56
2005.10.30
Запись CD-R(W)


4-1124854876
Alisher
2005-08-24 07:41
2005.10.30
Как при использовании IStorage удалить из хранилища бинарник


14-1128709701
default
2005-10-07 22:28
2005.10.30
"Живое" пиво, срок хранения три дня





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