加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 同时移动2个表单

发布时间:2020-12-15 17:21:52 所属栏目:百科 来源:网络整理
导读:我在这里停留了一下.我试图在不使用OnMove,LocationChanged,Docking等的情况下同时移动2个表单. 与其位置进行交互的唯一方法是覆盖WndProc.可能有用的东西是表单A是表单B的所有者.因此,每当A移动时,我也想移动B.不是相同的位置,但相同的距离. protected over
我在这里停留了一下.我试图在不使用OnMove,LocationChanged,Docking等的情况下同时移动2个表单.

与其位置进行交互的唯一方法是覆盖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个对象.

解决方法

避免使用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);
    }

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读