我在这里停留了一下.我试图在不使用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); }
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。