using DevExpress.XtraBars.Docking; using System; using System.Drawing; using System.Windows.Forms; namespace Gs.DevApp.ToolBox { public class DragResizeHelp { #region Field private bool isDragging = false; private const int Band = 5; private const int MinWidth = 50; private const int MinHeight = 30; private EnumMousePointPosition m_MousePointPosition; private Point p, p1; private Control dragBox1;//容器1 private string dragBoxCurrentName = "";//当前容器的名称 private Control ctrlCurrentObj;//当前拖拖动的对像 private DevExpress.XtraBars.Docking.DockManager dockManager1; private DevExpress.XtraBars.Docking.DockPanel dockPanel1; private DevExpress.XtraBars.Docking.ControlContainer dockPanel1_Container; private System.ComponentModel.IContainer components = null; //private ToolTip toolTip; #endregion #region Inner Object private enum EnumMousePointPosition { MouseSizeNone = 0, //'无 MouseSizeRight = 1, //'拉伸右边框 MouseSizeLeft = 2, //'拉伸左边框 MouseSizeBottom = 3, //'拉伸下边框 MouseSizeTop = 4, //'拉伸上边框 MouseSizeTopLeft = 5, //'拉伸左上角 MouseSizeTopRight = 6, //'拉伸右上角 MouseSizeBottomLeft = 7, //'拉伸左下角 MouseSizeBottomRight = 8, //'拉伸右下角 MouseDrag = 9 // '鼠标拖动 } #endregion public DragResizeHelp(DevExpress.XtraEditors.XtraForm frm, Control regBox) { // toolTip = new ToolTip(); this.components = new System.ComponentModel.Container(); dragBox1 = regBox; this.components = new System.ComponentModel.Container(); this.dockManager1 = new DevExpress.XtraBars.Docking.DockManager(this.components); dockManager1.BeginUpdate(); this.dockPanel1 = new DevExpress.XtraBars.Docking.DockPanel(); this.dockPanel1_Container = new DevExpress.XtraBars.Docking.ControlContainer(); ((System.ComponentModel.ISupportInitialize)(this.dockManager1)).BeginInit(); this.dockPanel1.SuspendLayout(); frm.SuspendLayout(); // // dockManager1 // this.dockManager1.Form = frm; this.dockManager1.RootPanels.AddRange(new DevExpress.XtraBars.Docking.DockPanel[] { this.dockPanel1}); this.dockManager1.TopZIndexControls.AddRange(new string[] { "DevExpress.XtraBars.BarDockControl", "DevExpress.XtraBars.StandaloneBarDockControl", "System.Windows.Forms.MenuStrip", "System.Windows.Forms.StatusStrip", "System.Windows.Forms.StatusBar", "DevExpress.XtraBars.Ribbon.RibbonStatusBar", "DevExpress.XtraBars.Ribbon.RibbonControl", "DevExpress.XtraBars.Navigation.OfficeNavigationBar", "DevExpress.XtraBars.Navigation.TileNavPane", "DevExpress.XtraBars.TabFormControl", "DevExpress.XtraBars.FluentDesignSystem.FluentDesignFormControl", "DevExpress.XtraBars.ToolbarForm.ToolbarFormControl"}); // // dockPanel1 // this.dockPanel1.Controls.Add(this.dockPanel1_Container); this.dockPanel1.Dock = DevExpress.XtraBars.Docking.DockingStyle.Float; this.dockPanel1.FloatLocation = new System.Drawing.Point(1617, 547); this.dockPanel1.FloatSize = new System.Drawing.Size(306, 459); this.dockPanel1.ID = new System.Guid("7148938b-5fd8-4833-9a9f-445a728a11cf"); this.dockPanel1.Location = new System.Drawing.Point(0, 0); this.dockPanel1.Name = "dockPanel1"; this.dockPanel1.OriginalSize = new System.Drawing.Size(200, 200); this.dockPanel1.Size = new System.Drawing.Size(306, 459); this.dockPanel1.Text = "组件箱"; dockPanel1.Options.AllowDockBottom = false; dockPanel1.Options.AllowDockFill = false; dockPanel1.Options.AllowDockLeft = false; dockPanel1.Options.AllowDockRight = false; dockPanel1.Options.AllowDockTop = false; dockPanel1.Options.ShowMaximizeButton = false; dockPanel1.Options.ShowMaximizeButton = false; // // dockPanel1_Container // this.dockPanel1_Container.Location = new System.Drawing.Point(5, 32); this.dockPanel1_Container.Name = "dockPanel1_Container"; this.dockPanel1_Container.Size = new System.Drawing.Size(296, 423); this.dockPanel1_Container.TabIndex = 0; this.dockPanel1_Container.BorderStyle = System.Windows.Forms.BorderStyle.None; // // XtraForm1 // frm.AutoScaleDimensions = new System.Drawing.SizeF(8F, 18F); frm.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; frm.ClientSize = new System.Drawing.Size(1057, 660); ((System.ComponentModel.ISupportInitialize)(this.dockManager1)).EndInit(); this.dockPanel1.ResumeLayout(false); frm.ResumeLayout(false); dockManager1.EndUpdate(); this.dockPanel1.Hide(); dockPanel1.ClosedPanel += (s, e) => { foreach (Control control in dragBox1.Controls) { if (control != null) { control.MouseDown -= new MouseEventHandler(control_MouseDown); control.MouseLeave -= new EventHandler(control_MouseLeave); control.MouseMove -= new MouseEventHandler(control_MouseMove); control.MouseUp -= Control_MouseUp; control.Resize -= myPanel_Resize; } } }; } public void Show() { if (dockPanel1.Visibility == DockVisibility.Visible) return; foreach (Control control in dragBox1.Controls) { if (control != null) { dragBoxCurrentName = dragBox1.Name; control.MouseDown += new MouseEventHandler(control_MouseDown); control.MouseLeave += new EventHandler(control_MouseLeave); control.MouseMove += new MouseEventHandler(control_MouseMove); control.MouseUp += Control_MouseUp; control.Resize += myPanel_Resize; control.ContextMenuStrip = new ContextMenuStrip(); } } dockPanel1.Show(); isDragging = true; } public void Hide(Control control) { if (control != null) { control.MouseDown -= new MouseEventHandler(control_MouseDown); control.MouseLeave -= new EventHandler(control_MouseLeave); control.MouseMove -= new MouseEventHandler(control_MouseMove); control.MouseUp -= Control_MouseUp; control.Resize -= myPanel_Resize; } dockPanel1.Hide(); isDragging = false; } #region Public Method private void Control_MouseUp(object sender, MouseEventArgs e) { Control lCtrl = (sender as Control); ctrlCurrentObj = lCtrl; (sender as Control).Refresh(); dragBoxCurrentName = (sender as Control).Parent.Name; if (dragBox1.Name == dragBoxCurrentName) { if (IsOutsideBounds(lCtrl, dragBox1)) { dragBox1.Controls.Remove(lCtrl); dockPanel1_Container.Controls.Add(lCtrl); lCtrl.Left = 0; lCtrl.Top = 10; // isDragging = false; dragBoxCurrentName = dockPanel1_Container.Name; } // reloadLoaction(null); } else if (dockPanel1_Container.Name == dragBoxCurrentName) { if (IsOutsideBounds(lCtrl, dockPanel1_Container)) { dockPanel1_Container.Controls.Remove(lCtrl); dragBox1.Controls.Add(lCtrl); lCtrl.Left = 0; lCtrl.Top = 10; // isDragging = false; dragBoxCurrentName = dragBox1.Name; } reloadLoaction(lCtrl); } } private void control_MouseDown(object sender, MouseEventArgs e) { p.X = e.X; p.Y = e.Y; p1.X = e.X; p1.Y = e.Y; isDragging = true; dragBoxCurrentName = (sender as Control).Parent.Name; ctrlCurrentObj = (sender as Control); if (e.Button == MouseButtons.Right) { Control control = (sender as Control); var menu = control.ContextMenuStrip; menu.Items.Clear(); SetDrag frm = new SetDrag(); menu.Items.Add($"设置坐标", null, (ss, ee) => { frm.ShowDialog(); }); menu.Items.Add($"设置大小", null, (ss, ee) => { frm.ShowDialog(); }); menu.Items.Add($"高级设置", null, (ss, ee) => { frm.ShowDialog(); }); menu.Items.Add($"一键重排", null, (ss, ee) => { reloadLoaction((sender as Control).Parent); }); menu.Show(control, e.Location); } } private void myPanel_Resize(object sender, EventArgs e) { Control panel = sender as Control; if (panel != null && panel.Controls.Count > 0) { foreach (Control childControl in panel.Controls) { // childControl.BorderStyle = DevExpress.XtraEditors.Controls.BorderStyles.NoBorder; childControl.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right))); int newY = (panel.ClientSize.Height - childControl.Height) / 2; childControl.Location = new Point(childControl.Location.X, newY); } } reloadMsg(panel); } private void control_MouseLeave(object sender, EventArgs e) { m_MousePointPosition = EnumMousePointPosition.MouseSizeNone; Control control = sender as Control; control.Cursor = Cursors.Arrow; ctrlCurrentObj = control; } private void control_MouseMove(object sender, MouseEventArgs e) { if (!isDragging) { return; } Control lCtrl = (sender as Control); ctrlCurrentObj = lCtrl; if (e.Button == MouseButtons.Left) { switch (m_MousePointPosition) { case EnumMousePointPosition.MouseDrag: lCtrl.Left = lCtrl.Left + e.X - p.X; lCtrl.Top = lCtrl.Top + e.Y - p.Y; break; case EnumMousePointPosition.MouseSizeBottom: lCtrl.Height = lCtrl.Height + e.Y - p1.Y; p1.X = e.X; p1.Y = e.Y; //'记录光标拖动的当前点 break; case EnumMousePointPosition.MouseSizeBottomRight: lCtrl.Width = lCtrl.Width + e.X - p1.X; lCtrl.Height = lCtrl.Height + e.Y - p1.Y; p1.X = e.X; p1.Y = e.Y; //'记录光标拖动的当前点 break; case EnumMousePointPosition.MouseSizeRight: lCtrl.Width = lCtrl.Width + e.X - p1.X; lCtrl.Height = lCtrl.Height + e.Y - p1.Y; p1.X = e.X; p1.Y = e.Y; //'记录光标拖动的当前点 break; case EnumMousePointPosition.MouseSizeTop: lCtrl.Top = lCtrl.Top + (e.Y - p.Y); lCtrl.Height = lCtrl.Height - (e.Y - p.Y); break; case EnumMousePointPosition.MouseSizeLeft: lCtrl.Left = lCtrl.Left + e.X - p.X; lCtrl.Width = lCtrl.Width - (e.X - p.X); break; case EnumMousePointPosition.MouseSizeBottomLeft: lCtrl.Left = lCtrl.Left + e.X - p.X; lCtrl.Width = lCtrl.Width - (e.X - p.X); lCtrl.Height = lCtrl.Height + e.Y - p1.Y; p1.X = e.X; p1.Y = e.Y; //'记录光标拖动的当前点 break; case EnumMousePointPosition.MouseSizeTopRight: lCtrl.Top = lCtrl.Top + (e.Y - p.Y); lCtrl.Width = lCtrl.Width + (e.X - p1.X); lCtrl.Height = lCtrl.Height - (e.Y - p.Y); p1.X = e.X; p1.Y = e.Y; //'记录光标拖动的当前点 break; case EnumMousePointPosition.MouseSizeTopLeft: lCtrl.Left = lCtrl.Left + e.X - p.X; lCtrl.Top = lCtrl.Top + (e.Y - p.Y); lCtrl.Width = lCtrl.Width - (e.X - p.X); lCtrl.Height = lCtrl.Height - (e.Y - p.Y); break; default: break; } if (lCtrl.Width < MinWidth) lCtrl.Width = MinWidth; if (lCtrl.Height < MinHeight) lCtrl.Height = MinHeight; } else { m_MousePointPosition = MousePointPosition(lCtrl.Size, e); //'判断光标的位置状态 Control control = sender as Control; switch (m_MousePointPosition) //'改变光标 { case EnumMousePointPosition.MouseSizeNone: control.Cursor = Cursors.Arrow; //'箭头 break; case EnumMousePointPosition.MouseDrag: control.Cursor = Cursors.SizeAll; //'四方向 break; case EnumMousePointPosition.MouseSizeBottom: control.Cursor = Cursors.SizeNS; //'南北 break; case EnumMousePointPosition.MouseSizeTop: control.Cursor = Cursors.SizeNS; //'南北 break; case EnumMousePointPosition.MouseSizeLeft: control.Cursor = Cursors.SizeWE; //'东西 break; case EnumMousePointPosition.MouseSizeRight: control.Cursor = Cursors.SizeWE; //'东西 break; case EnumMousePointPosition.MouseSizeBottomLeft: control.Cursor = Cursors.SizeNESW; //'东北到南西 break; case EnumMousePointPosition.MouseSizeBottomRight: control.Cursor = Cursors.SizeNWSE; //'东南到西北 break; case EnumMousePointPosition.MouseSizeTopLeft: control.Cursor = Cursors.SizeNWSE; //'东南到西北 break; case EnumMousePointPosition.MouseSizeTopRight: control.Cursor = Cursors.SizeNESW; //'东北到南西 break; default: break; } control.Refresh(); Graphics g = control.CreateGraphics(); int width = control.Width; int height = control.Height; Point[] ps = { new Point(0, 0),new Point(width - 1, 0), new Point(width - 1, height - 1),new Point(0, height - 1),new Point(0, 0) }; g.DrawLines(new Pen(Color.Pink), ps); } // reloadLoaction(); reloadMsg(lCtrl); } private EnumMousePointPosition MousePointPosition(Size size, System.Windows.Forms.MouseEventArgs e) { if ((e.X >= -1 * Band) | (e.X <= size.Width) | (e.Y >= -1 * Band) | (e.Y <= size.Height)) { if (e.X < Band) { if (e.Y < Band) { return EnumMousePointPosition.MouseSizeTopLeft; } else { if (e.Y > -1 * Band + size.Height) { return EnumMousePointPosition.MouseSizeBottomLeft; } else { return EnumMousePointPosition.MouseSizeLeft; } } } else { if (e.X > -1 * Band + size.Width) { if (e.Y < Band) { return EnumMousePointPosition.MouseSizeTopRight; } else { if (e.Y > -1 * Band + size.Height) { return EnumMousePointPosition.MouseSizeBottomRight; } else { return EnumMousePointPosition.MouseSizeRight; } } } else { if (e.Y < Band) { return EnumMousePointPosition.MouseSizeTop; } else { if (e.Y > -1 * Band + size.Height) { return EnumMousePointPosition.MouseSizeBottom; } else { return EnumMousePointPosition.MouseDrag; } } } } } else { return EnumMousePointPosition.MouseSizeNone; } } public bool IsOutsideBounds(Control childControl, Control parentControl) { if (parentControl == null) return true; if (parentControl == null) return true; int _w = childControl.Width / 2; int _h = childControl.Height / 2; // 获取父控件的客户区矩形(相对于父控件自己) Rectangle parentClientRect = parentControl.ClientRectangle; // 获取子控件相对于父控件的位置和尺寸 Rectangle childRectRelativeToParent = childControl.Bounds; // 检查子控件的左边界是否超出了父控件的左边界 if (childRectRelativeToParent.Left < parentClientRect.Left - _w) return true; // 检查子控件的右边界是否超出了父控件的右边界 if (childRectRelativeToParent.Right > parentClientRect.Right + _w) return true; // 检查子控件的顶边界是否超出了父控件的顶边界 if (childRectRelativeToParent.Top < parentClientRect.Top - _h) return true; // 检查子控件的底边界是否超出了父控件的底边界 if (childRectRelativeToParent.Bottom > parentClientRect.Bottom + _h) return true; // 如果子控件的所有边界都在父控件的边界内,则返回false return false; } #endregion private void reloadLoaction(Control cocccc) { int _top = 0; //如果是控件箱,不移Left if (dockPanel1_Container.Name == dragBoxCurrentName) { foreach (Control col in dockPanel1_Container.Controls) { col.Left = 0; col.Top = _top; _top += (col.Height + 2); } return; } if (cocccc == null) return; //这是容器 int x = 2; int y = 2; foreach (Control btn in dragBox1.Controls) { if (cocccc.Name == btn.Name) continue; if (cocccc.Visible ==false) continue; btn.Left = x; btn.Top = y; x += btn.Width + 2; if (btn.Width > dragBox1.Width - x) { x = 2; y += btn.Height +2; } } cocccc.Left = x; cocccc.Top = y; return; } private void reloadMsg(Control cocccc) { System.Text.StringBuilder sb = new System.Text.StringBuilder(); if (ctrlCurrentObj != null) sb.Append(ctrlCurrentObj.Name + "在"); sb.Append(string.IsNullOrEmpty(dragBoxCurrentName) ? "表单中" : "组件箱中"); sb.Append(",坐标:" + cocccc.Location.ToString()); sb.Append(",大小:" + cocccc.Size.ToString()); // toolTip.SetToolTip(ctrlCurrentObj, sb.ToString()); } } }