przeciąganie wielu okien naraz

0

Witam,

Do przemieszczania okna przez przeciąganie używam kodu w zdarzeniu OnMouseDown

ReleaseCapture;
SendMessage(okno.Handle, WM_SYSCOMMAND, $F012, 0);

Działa ok. Jednak chciałbym aby przeciągając okno razem z nim przemieszczały się jeszcze inne okna. Te inne okna nie są w żaden sposób spokrewnione z aktywnym oknem (z wyjątkiem wspólnej formy). Dodanie do powyższego kodu linijek z wysyłaniem komunikatu $F012 do okien, które mają być przesuwane nie działa. Czy ktoś miał podobny problem i wie jak to zrobić?

0

ciezko jest to ladnie zrobic. efekt zalezy tylko od tego, czy masz wlaczona w systemie opcje "pokaz zawartosc okna podczas rzeciagania". jesli jest wylaczona no to wtedy zamiast okna pokazuje sie ramka i nie wiem, czy da sie zrobic zeby w windowsie pokazywaly sie na raz dwie ramki:/
ale jesli chodzi tylko o przesuwanie dwoch okien na raz to:

  public
    procedure Moving(var Message: TMessage); message WM_MOVING;
    procedure EnterSizeMove(var Message: TMessage); message WM_ENTERSIZEMOVE;
  end;

var
  Form1: TForm1;
  x,y:Integer;
implementation

[...]

procedure TForm1.EnterSizeMove(var Message: TMessage);
begin
x:=Form1.Left-Form2.Left;
y:=Form1.Top-Form2.Top;
end;

procedure TForm1.Moving(var Message: TMessage);
var R:PRect;
begin
R:=Pointer(Message.LParam);

Form2.Left:=R.Left-x;
Form2.Top:=R.Top-y;
end;

pozdrawiam ;]

0

Dzięki Cimak.
W międzyczasie znalazłem rozwiązaniem z obsługą komunikatu WM_WINDOWPOSCHANGING.
I tak jeśli np. chcemy aby przesuwając TOkno równolegle z nim przesuwały się wszystkie okna klasy TOknoDoPrzesuniecia to robimy jak następuje:

procedure TOkno.OnMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
ReleaseCapture;
SendMessage(Handle, WM_SYSCOMMAND, $F012, 0);
end;

procedure TOkno.WMWindowPosChanging(var Msg: TWMWindowPosChanging);
var
x, y, i: integer;
begin
y := Msg.WindowPos^.Y;
x := Msg.WindowPos^.X;
if (x <> 0) or (y <> 0) then
begin
with Form1 do
begin
for i := 0 to ControlCount-1 do
begin
if Controls[i] is TOknoDoPrzesuniecia then
begin
Controls[i].SetBounds(Controls[i].Left + x - Self.Left,
Controls[i].Top + y - Self.Top,
Controls[i].Width,
Controls[i].Height);
end;
end;
end;
end;
inherited;
end;

1 użytkowników online, w tym zalogowanych: 0, gości: 1