Форум: "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 Contentsunit 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.047 c