Перемещение 2 форм одновременно - PullRequest
4 голосов
/ 18 ноября 2011

Я немного застрял здесь. Я пытаюсь переместить 2 формы одновременно, не используя OnMove, LocationChanged, Docking и т. Д.

Единственный способ взаимодействия с их местоположениями - переопределить WndProc. Что-то, что могло бы быть полезным, - то, что форма A является владельцем формы B. Поэтому всякий раз, когда A перемещается, я также хочу перемещать B. Не в том же месте, но на том же расстоянии.

    protected override void WndProc(ref Message m)
    {
        if (m.Msg == 0x0084)
        {
              Form[] temp = this.OwnedForms;

              if(temp.Length > 0) 
              {
                    /* moving temp[0] to the same ratio as this form */
              }

              m.Result = (IntPtr)2;
              return;
        }
        base.WndProc(ref m);
    }

И A, и B имеют один и тот же WndProc, поскольку они представляют собой 2 объекта из одного класса.

Ответы [ 2 ]

3 голосов
/ 18 ноября 2011

Не имеет смысла избегать использования события LocationChanged:

    private Point lastPos;

    protected override void OnLoad(EventArgs e) {
        base.OnLoad(e);
        lastPos = this.Location;
    }

    protected override void OnLocationChanged(EventArgs e) {
        base.OnLocationChanged(e);
        foreach (var frm in this.OwnedForms) {
            frm.Location = new Point(frm.Location.X + this.Left - lastPos.X,
                frm.Location.Y + this.Top - lastPos.Y);
        }
        lastPos = this.Location;
    }

    protected override void WndProc(ref Message m) {
        // Move borderless window with click-and-drag on client window
        if (m.Msg == 0x84) m.Result = (IntPtr)2;
        else base.WndProc(ref m);
    }
0 голосов
/ 19 ноября 2011

Мне удалось решить проблему:

protected override void WndProc(ref Message m)
{
    Form temp = this.Owner;

    if (m.Msg == 0x0084)
    {
          m.Result = (IntPtr)2;
          return;
    }

    if (m.Msg == 0x0216 && temp != null)
    {
         if (!movedonce)
         {
              oldlocationx = this.Location.X;
              oldlocationy = this.Location.Y;
              movedonce = true;
         }

         temp.Location = new Point(temp.Location.X + this.Location.X - oldlocationx, temp.Location.Y + this.Location.Y - oldlocationy);
         oldlocationx = this.Location.X;
         oldlocationy = this.Location.Y;
    }

    base.WndProc(ref m);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...